2010-07-13 6 views
4

Je souhaite dire qu'une certaine monade st paramétrée fonctionne avec une mémoire régulière, mais une sous-classe de mon monade paramétrée devrait imposer une contrainte supplémentaire sur le type de mémoire. Dans le code:Haskell typeclass inheritance et typeclass paramétrique

class Memory m where 
    ... 

class State st where 
    unit :: Memory m => a -> st m m a 
    bind :: (Memory m1, Memory m2, Memory m3) => st m1 m2 a -> (a -> st m2 m3 b) -> st m1 m3 b 

class RMemory m where 
    ... 

class State st => RState st where 
    -- no operators 

maintenant mon problème est que je veux imposer que chaque fois (RState st) est vrai, dans la définition de (Etat st) La mémoire est remplacé par RMemory; cela transformerait l'état en quelque chose de paramétrique dans la classe de type de sa mémoire. Cela peut-il être fait?

Répondre

3

Je suppose que vous ne pouvez pas le faire directement. Vous pouvez cependant tricher très efficacement en ajoutant un niveau d'indirection. Voir Types de données restreintes de John Hughes dans Haskell pour savoir comment procéder: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.2816

Ceci est la même technique utilisée, par exemple, pour obtenir une récurrence ouverte dans syb-with-class.

Je suis assez certain que cela devrait vous orienter dans la bonne direction.