Предположим, что у меня есть 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
параметре типа в таком объявлении экземпляра?