Я возился с общими классами типов для списков в Haskell.
class HasEmpty a where
empty :: a
isEmpty :: a -> Bool
class HasEmpty (l a) => List l where
cons :: a -> l a -> l a
uncons :: l a -> (a, l a)
Чтобы дать вам представление о том, как это может работать, вот примеры для []
:
instance HasEmpty [a] where
empty = []
isEmpty [] = True
isEmpty _ = False
instance List [] where
cons = (:)
uncons (x:xs) = (x,xs)
Однако возникает ошибка:
Not in scope: type variable 'a'
Это вызвано ограничением HasEmpty (l a)
.Я не отчаянно заинтересован в этом конкретном примере, но меня интересует концепция в целом.HasEmpty
является классом для типов вида *
, а List
является классом для типов вида * -> *
. Могу ли я сделать ограничение класса типов другого типа, чем класс типов, который он ограничивает?