我想编写一个单调类型类,该类将指定DSL(特定于域)Monad的一些基本操作。

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

在哪里 ExprType 指示表达式类型,并 var 将引入新的变量声明。

这个想法是我有一个基础单子 Base 实施 MyDSLMonad, ,也许只是在类似的事情上起作用 Int'沙 BoolS,然后是更高级别的抽象将是Monad Transformers,可以在更高级别的类型上使用。

但是,实施 Base' var 功能可能依赖于仅适用于 Int'沙 Bool的,并且需要某种类型的类别约束 var 功能。所以,我想要类似的东西

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

instance MyDSLMonad Base where
    class ValidTypes Base = MyClass

我意识到 rmonads 通过某种类型的情况会这样做,但是有更好的方法吗?另外,我有点喜欢拥有像Monad Transformers这样的 StateT 在常规的单调包中... :)

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top