帮助编写monad类型类(关联类型类?)

时间:2011-09-05 06:13:52

标签: haskell typeclass associated-types

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

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

其中ExprType表示表达式类型,var将引入新的变量声明。

我的想法是,我会有一个实施Base的基础monad MyDSLMonad,它可能适用于IntBool之类的内容,以及那么更高级别的抽象将是monad变换器,它可以在更高级别的类型上工作。

但是,Base的{​​{1}}函数的实现可能依赖于它仅适用于varInt的事实,并且需要一些Bool函数的类型类约束。所以,我想要像

这样的东西
var

我知道class Monad => MyDSLMonad where type ExprTyp :: * -> * class ValidTypes var :: ValidTypes α => String -> ExprTyp α -> (ExprTyp α) instance MyDSLMonad Base where class ValidTypes Base = MyClass 通过某种类型的情况来做到这一点,但是有更好的方法吗?另外,我有点像常规monad包中的rmonads那样的monad变换器......:)

1 个答案:

答案 0 :(得分:2)

还没有更好的方法。 Max Bolingbroke正在GHC中建造这个,希望它将以7.4的速度到达。请参阅https://twitter.com/mbolingbroke,这是一个示例:http://hpaste.org/50576