Question

Je veux écrire une classe de type monade qui précisera certaines actions de base pour une connexion DSL (langage spécifique au domaine) monade.

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 un Base monade de base mise en œuvre MyDSLMonad, qui peut-être fonctionne sur des choses comme celles de Int et Bool de, puis des abstractions de niveau supérieur seront transformateurs monade, qui peuvent travailler sur les types de niveau supérieur.

Toutefois, la mise en œuvre de la fonction de Base var peut compter sur le fait que cela ne fonctionne que sur de Int et Bool de, et nécessitent une sorte de type de contrainte de classe 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 cela via un caseing de type, mais est-il un moyen de plus agréable? En outre, j'ai un peu comme avoir des transformateurs monade comme StateT dans le paquet monades régulier ...:)

Était-ce utile?

La solution

Il n'y a aucun moyen de plus belle, encore. Max Bolingbroke construit cela dans GHC, espérons qu'il arrivera à 7.4. Voir https://twitter.com/mbolingbroke , voici un exemple: http://hpaste.org/50576

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top