Предположим, что у меня есть Heap a типа, где Heap является конструктором типа вида * → *. Многие основные операции по куче требуют a типе, чтобы быть экземпляром Ord класса типа.
data Heap a = ...
findMin :: Ord a => Heap a -> a
deleteMin :: Ord a => Heap a -> Heap a
Я хочу, чтобы объявить мой Heap типа как экземпляр Foldable классы типа, как только параметр типа является экземпляром a Ord класса типа (это будет легко выразить через findMin и deleteMin функции).
Такое отношение можно легко выразить, когда мы имеем дело с типами классов, которые требуют типа вида *, например Show:
instance Show a => Show (Heap a) where
show h = ...
Но у меня проблемы с декларированием Foldable:
instance Foldable Heap where
-- Ouch, there is no 'a' type parameter to put the constraint on!
foldr f z h = ...
Можно ли ставить ограничение на a параметре типа в таком объявлении экземпляра?