Вы ограничили etype
значением Ord
в определении OutE
:
data (Ord etype) => OutE vtype etype = ...
Но в случае Eq
вы фактически пытаетесь определить экземпляр для any etype
без ограничений.
instance Eq (OutE vtype etype) where
Конечно, это не работает, поскольку OutE
сам по себе только что определен для Ord etype
s, поэтому вам придется добавить ограничение класса типовк определению экземпляра.
instance (Ord etype) => Eq (OutE vtype etype) where
Обратите внимание, что для работы класса типов достаточно одного определения ==
или /=
.
Обратите внимание, что частопроще и поэтому считается, что лучше стиль не иметь ограничения класса типов для data
-типов, а только для экземпляров / методов, которые фактически требуют функциональности класса типов.
Во многих случаях человеку не нужно ограничение, и он просто заканчивается ненужными неуклюжими сигнатурами типов.
Возьмем, например, какой-то упорядоченный тип карты Ord key => Map key value
.
Что еслимы просто хотим перечислить все ключи?Или получить количество элементов?Нам не нужно, чтобы ключи были Ord
для них, так почему бы просто не оставить карту неограниченной с помощью простого
getKeys :: Map key value -> [key]
getLength :: Map key value -> Int
и просто добавить класс типов, когда он нам действительно нужен в такой функции, как
insert :: Ord key => key -> value -> Map key value