Вопрос по haskell, types – Классы типов в типах данных Haskell

14

В Haskell можно определить тип данных следующим образом:

data Point1 = Point1 {
    x :: Integer
  , y :: Integer
}

Можно ли использовать классы типов для переменных внутри типа данных? Если так, то как? Я понимаю, что это можно сделать как алгебраический тип данных, с различным определением для каждого типа точек, но мне интересно, есть ли способ сделать это более компактным и гибким способом.

например Что-то вроде этогоpseudocode который использует синтаксис объявления функции:

data Point2 = Point2 {
    x :: (Num a, Ord a) => a
  , y :: (Num a, Ord a) => a
}

Цель состояла бы в том, чтобы позволить одному хранитьInt, Integer, Float или жеDouble значения в типе данных. В идеале я хотел бы ограничить его так, чтобы x и y были одного типа.

Ваш Ответ

2   ответа
19

Вы должны решить, хотите ли вы экзистенциальную или универсальную количественную оценку для этого типа. Универсальное количественное определение, аля:

data (Num a, Ord a) => Point2 a = Point2 a a

дает обязательное доказательство того, что экземпляры Num и Ord существуют для типа «a»; но на самом деле это не очень помогает, потому что все, что он делает, это дает вам обязательство, когда вы переходите к использованию класса Point, создавая значение этого типа или когда вы идете в соответствие с шаблоном.

Почти во всех случаях вам лучше определить

data Point2 a = Point2 a a deriving (Eq,Ord,Show,Read)

и сделать каждый из ваших экземпляров зависимым от дополнительной информации, которую вы хотите.

instance Num a => Num (Point2 a) where
    ...

instance (Num a, Ord a) => SomeClass (Point2 a) where
    ...

Это позволяет обходить и создавать меньше лишних словарей и увеличивает количество сценариев, в которых может использоваться ваш тип данных Point2.

С другой стороны, экзистенциальная количественная оценка может позволить вам сказать, что вам вообще все равно, какой тип (ближе к тому, что вы на самом деле запросили, наберите мудрый), за счет того, что вы не можете использовать на нем что-либо, кроме предоставленных операций. в соответствии с указанными вами ограничениями - здесь довольно плохо.

Error: User Rate Limit Exceeded Gregyski
Error: User Rate Limit Exceeded
7

что-то вроде этого?

data (Num a, Ord a) => Point2 a = Point2 {
    x :: a
  , y :: a
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Gregyski

Похожие вопросы