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