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 ... :)

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top