aide à écrire un monade classe de types (classes de type associé?)
-
25-10-2019 - |
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 𝔪 α)
où 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 ...:)
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