【发布时间】:2012-11-21 02:57:29
【问题描述】:
在MonadTrans 类中:
class MonadTrans t where
-- | Lift a computation from the argument monad to the constructed monad.
lift :: Monad m => m a -> t m a
为什么t m 不被限制为 Monad?即,为什么不:
{-# LANGUAGE MultiParamTypeClasses #-}
class Monad (t m) => MonadTrans t m where
lift :: Monad m => m a -> t m a
如果答案是“因为它就是这样”,那很好 - 只是让 n008 感到困惑。
【问题讨论】:
-
如果
t是一个monad,那么它的类型必须是* -> *,而t m a的类型是* -> * -> *,我想(也许我错了)。 -
将 monad 操作应用于
t m的“值”是否有意义?是否有t m的值? -
糟糕,并不是要忽略这个限制。添加它。谢谢。
-
@EarlGray,不,没有。
t m有种类* -> *,类型(即值的类型)有种类*。但同样将 monad 操作应用于Maybe的“值”是没有意义的,因为没有。 -
类按原样定义而不是按照您的方式定义的一个原因是,至少对于
transformers包而言,可移植性。 MPTC 是一种语言扩展,因此使用起来不方便。
标签: haskell monads typeclass monad-transformers