Введите классы в типах данных Haskell

Это - просто соглашение. JVM могла, конечно, иметь дело с нестатическими основными методами, если это будет соглашением. В конце концов, можно определить статический инициализатор на классе и инстанцировать огромного количества объектов перед когда-либо получением к основному () метод.

15
задан nbro 3 March 2017 в 00:35
поделиться

2 ответа

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

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

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

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

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.

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

19
ответ дан 1 December 2019 в 02:46
поделиться

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

data (Num a, Ord a) => Point2 a = Point2 {
    x :: a
  , y :: a
}
7
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

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