我想编写一个monad类型类,它将为DSL(特定于域的语言)monad指定一些基本操作。
class Monad => MyDSLMonad where
type ExprTyp :: * -> *
var :: String -> ExprTyp α -> (ExprTyp α)
其中ExprType
表示表达式类型,var
将引入新的变量声明。
我的想法是,我会有一个实施Base
的基础monad MyDSLMonad
,它可能适用于Int
和Bool
之类的内容,以及那么更高级别的抽象将是monad变换器,它可以在更高级别的类型上工作。
但是,Base
的{{1}}函数的实现可能依赖于它仅适用于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
通过某种类型的情况来做到这一点,但是有更好的方法吗?另外,我有点像常规monad包中的rmonads
那样的monad变换器......:)
答案 0 :(得分:2)
还没有更好的方法。 Max Bolingbroke正在GHC中建造这个,希望它将以7.4的速度到达。请参阅https://twitter.com/mbolingbroke,这是一个示例:http://hpaste.org/50576