Я возился с классами общего типа для списков в 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 — это класс для типов вида * -> *. Могу ли я сделать ограничение класса типов другого типа, чем класс типов, который он ограничивает?