【发布时间】:2010-04-18 10:26:28
【问题描述】:
我正在尝试为未来的项目创建一个 monad 转换器,但不幸的是,我的 Monad 类型类 (>>=) 函数的实现不起作用。
首先,这里是底层 monad 的实现:
newtype Runtime a = R {
unR :: State EInfo a
} deriving (Monad)
这里,Monad 类型类的实现由 GHC 自动完成(使用 GeneralizedNewtypeDeriving 语言编译指示)。
monad 转换器是这样定义的:
newtype RuntimeT m a = RuntimeT {
runRuntimeT :: m (Runtime a)
}
问题来自我实例化 Monad 类型类的 (>>=) 函数的方式:
instance (Monad m) => Monad (RuntimeT m) where
return a = RuntimeT $ (return . return) a
x >>= f = runRuntimeT x >>= id >>= f
在我看来,第一个 >>= 在底层 m monad 中运行。因此,runRuntimeT x >>= 返回一个Runtime a 类型的值(对吗?)。然后,下面的代码id >>= 应该返回一个a 类型的值。该值被传递给f :: (Monad m) => a -> RuntimeT m b 类型的函数f。
类型问题来了:f 函数的类型与 (>>=) 函数所需的类型不匹配。我能让这个连贯吗?我知道为什么这不起作用,但我无法将它变成实用的东西。
编辑:错误信息:
Core.hs:34:4:
Occurs check: cannot construct the infinite type: m = RuntimeT m
When generalising the type(s) for `>>='
In the instance declaration for `Monad (RuntimeT m)'
Failed, modules loaded: none.
感谢您的帮助,并毫不犹豫地纠正我信息中的任何缺陷,
查理 P.
【问题讨论】:
-
请向我们展示您收到的错误消息。
标签: haskell monad-transformers monads