Załóżmy, że mam typ Heap a
, gdzie Heap
jest konstruktorem typu * -> *
. Wiele podstawowych operacji na stercie wymaga, aby typ a
był instancją klasy typu Ord
.Ograniczenia parametrów typu dla typów czcionek z typem * -> *
data Heap a = ...
findMin :: Ord a => Heap a -> a
deleteMin :: Ord a => Heap a -> Heap a
Chcę zadeklarować moje Heap
typ jako przykład Foldable
klasy typu jak najszybciej a
typ parametr jest instancją klasy Ord
typu (będzie to łatwe, aby wyrazić poprzez findMin
i deleteMin
funkcji).
Ten rodzaj relacji można easely wyrażona gdy mamy do czynienia z klasami typu, które wymagają rodzaju rodzaju *
, jak Show
:
instance Show a => Show (Heap a) where
show h = ...
Ale mam problemy z deklaracją z Foldable
:
instance Foldable Heap where
-- Ouch, there is no `a` type parameter to put the constraint on!
foldr f z h = ...
Czy jest możliwe umieszczenie ograniczenia na parametrze typu a
w takiej deklaracji wystąpienia?
Spójrz na [te rzeczy] (http://blog.omega-prime.co.uk/?p=127). Robią coś podobnego z monadami. – phg
Bardzo dziękuję za link, "ConstraintKind" to naprawdę ciekawe rzeczy! –
Btw, czy 'findMin' naprawdę wymaga instancji' Ord'? – yairchu