我想编写一个 monad 类型类,它将为 DSL(特定于域的语言)monad 指定一些基本操作。
class Monad => MyDSLMonad where
type ExprTyp :: * -> *
var :: String -> ExprTyp α -> (ExprTyp α)
whereExprType
表示表达式的类型,并且var
会引入一个新的变量声明。
这个想法是我将有一个基本的 monadBase
实现MyDSLMonad
,它可能只适用于Int
's 和Bool
's 之类的东西,然后更高级别的抽象将是 monad 转换器,它可以在更高级别的类型上工作。
但是,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
通过某种类型的大小写来做到这一点,但是有更好的方法吗?另外,我有点喜欢像StateT
在常规 monads 包中那样使用 monad 转换器...... :)