Ayuda con la escritura de una tipografía de mónadas (clases de tipo asociado?)
-
25-10-2019 - |
Pregunta
Quiero escribir una clase de tipo Mónada que especifique algunas acciones básicas para una monad DSL (lenguaje específico de dominio).
class Monad 𝔪 => MyDSLMonad 𝔪 where
type ExprTyp 𝔪 :: * -> *
var :: String -> ExprTyp 𝔪 α -> 𝔪 (ExprTyp 𝔪 α)
dónde ExprType
indica el tipo de expresión y var
introducirá una nueva declaración variable.
La idea es que tendré una monada base Base
implementar MyDSLMonad
, que tal vez solo funciona en cosas como Int
'arena Bool
'S, y luego las abstracciones de nivel superior serán transformadores de monad, que pueden funcionar en tipos de niveles superiores.
Sin embargo, la implementación para Base
's var
la función puede confiar en el hecho de que solo funciona Int
'arena Bool
's, y requiere algún tipo de restricción de clase de tipo en el var
función. Entonces, quiero algo como
class Monad 𝔪 => MyDSLMonad 𝔪 where
type ExprTyp 𝔪 :: * -> *
class ValidTypes 𝔪
var :: ValidTypes 𝔪 α => String -> ExprTyp 𝔪 α -> 𝔪 (ExprTyp 𝔪 α)
instance MyDSLMonad Base where
class ValidTypes Base = MyClass
Soy consciente rmonads
Haga esto a través de algún tipo de caso, pero ¿hay una manera más agradable? Además, me gusta tener mónadas transformadores como StateT
En el paquete de Mónadas Regulares ... :)
Solución
Todavía no hay una manera más agradable. Max Bolingbroke está construyendo esto en GHC, con suerte llegará en 7.4. Ver https://twitter.com/mbolingbroke, aquí hay un ejemplo: http://hpaste.org/50576