1

我想编写一个 monad 类型类,它将为 DSL(特定于域的语言)monad 指定一些基本操作。

class Monad  => MyDSLMonad  where
    type ExprTyp  :: * -> *
    var :: String -> ExprTyp  α ->  (ExprTyp  α)

whereExprType表示表达式的类型,并且var会引入一个新的变量声明。

这个想法是我将有一个基本的 monadBase实现MyDSLMonad,它可能只适用于Int's 和Bool's 之类的东西,然后更高级别的抽象将是 monad 转换器,它可以在更高级别的类型上工作。

但是,Base'函数的实现可能依赖于它仅适用于' 和'var的事实,并且需要对该函数进行某种类型的类约束。所以,我想要类似的东西IntBoolvar

class Monad  => MyDSLMonad  where
    type ExprTyp  :: * -> *
    class ValidTypes 
    var :: ValidTypes  α => String -> ExprTyp  α ->  (ExprTyp  α)

instance MyDSLMonad Base where
    class ValidTypes Base = MyClass

我知道rmonads通过某种类型的大小写来做到这一点,但是有更好的方法吗?另外,我有点喜欢像StateT在常规 monads 包中那样使用 monad 转换器...... :)

4

1 回答 1

2

There's no nicer way, yet. Max Bolingbroke is building this in GHC, hopefully it will arrive in 7.4. See https://twitter.com/mbolingbroke, here's an example: http://hpaste.org/50576

于 2011-09-05T11:42:35.977 回答