2011-09-05 1 views
0

Je veux écrire une classe de type monad qui spécifiera quelques actions de base pour une monade DSL (langage spécifique au domaine).aide pour l'écriture d'une classe de type monad (classes de types associées?)

class Monad => MyDSLMonad where 
    type ExprTyp :: * -> * 
    var :: String -> ExprTyp α -> (ExprTyp α) 

ExprType indique le type d'expression, et var introduira une nouvelle déclaration variable.

L'idée est que je vais avoir une monade de base Base mise en œuvre MyDSLMonad, qui peut-être fonctionne sur des choses comme Int « s et Bool » s, puis des abstractions de plus haut niveau seront transformateurs monade, qui peuvent travailler sur plus types de niveau.

Cependant, la mise en œuvre pour Base « fonction de var peut compter sur le fait qu'il ne fonctionne que sur Int » s et Bool « s, et nécessitent une sorte de contrainte de classe de type sur la fonction var. Donc, je veux quelque chose comme

class Monad => MyDSLMonad where 
    type ExprTyp :: * -> * 
    class ValidTypes 
    var :: ValidTypes α => String -> ExprTyp α -> (ExprTyp α) 

instance MyDSLMonad Base where 
    class ValidTypes Base = MyClass 

Je suis au courant rmonads faire via une caseing de type, mais est-il une façon plus agréable? En outre, j'aime un peu avoir des transformateurs monad comme StateT dans le paquet de monades régulières ... :)

Répondre

Questions connexes