Supongamos que tengo Heap a
tipo donde Heap
es un constructor de tipo * -> *
. Muchas operaciones básicas en montón requieren que el tipo a
sea una instancia de la clase de tipo Ord
.Escriba restricciones de parámetros para las instancias de tipos de clase con tipo * -> *
data Heap a = ...
findMin :: Ord a => Heap a -> a
deleteMin :: Ord a => Heap a -> Heap a
quiero declarar mi tipo Heap
como una instancia de la clase Foldable
del modelo en cuanto a
parámetro de tipo es una instancia de la clase Ord
tipo (que será fácil de expresar a través de findMin
y deleteMin
funciones).
Este tipo de relación se puede easely expresó cuando se trata de clases de tipos que requieren el tipo de especie *
, como Show
:
instance Show a => Show (Heap a) where
show h = ...
Pero no tengo problemas con la declaración de Foldable
:
instance Foldable Heap where
-- Ouch, there is no `a` type parameter to put the constraint on!
foldr f z h = ...
¿Es posible poner una restricción en el parámetro de tipo a
en dicha declaración de instancia?
Echa un vistazo a [este material] (http://blog.omega-prime.co.uk/?p=127). Están haciendo algo similar con las mónadas. – phg
Muchas gracias por el enlace, 'ConstraintKind' es _realmente_ cosas interesantes! –
Por cierto, ¿'findMin' realmente requiere una instancia' Ord'? – yairchu