在 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
如果答案是“因为这就是它的方式”,那没问题——但对于一个新手来说,这会让人感到困惑。
t
是一个单子类型,它的种类必须是* -> *
,而t m a
的种类是* -> * -> *
,我认为(也许我错了)。 - Dmytro Sirenkot m
的种类是* -> *
,而类型(即值的类型)的种类是*
。但同样也没有意义将monad操作应用于Maybe
的"值",因为根本没有值。 - luquitransformers
包来说,原因之一是可移植性。 MPTC是一种语言扩展,因此使用它们是不可移植的。 - Daniel Fischer