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 α)
où 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 ... :)
meilleur lien ici: http://blog.omega-prime.co.uk/?p=127 – gatoatigrado