【发布时间】:2013-08-28 17:02:48
【问题描述】:
为什么MonadTrans不被定义为
class MonadTrans t where
lift :: (Monad m, Monad (t m)) => m a -> t m a
-- ^^^^^^^^^^^
而不是当前
class MonadTrans t where lift :: Monad m => m a -> t m a
这是 Haskell 98(与 Why aren't monad transformers constrained to yield monads? 中的建议不同)并确保结果始终是 monad。允许 monad 转换器产生不是 monad 的东西是有原因的吗?
【问题讨论】:
-
为什么要确保结果是 monad?这将是严格意义上的不那么普遍,我看不出它有什么好处。
-
@JohnL 主要是因为
MonadTranslaws 以单子形式表示,因此结果必须是单子。如果不是,则法律甚至无法表达。但是 bheklilr 在他的回答中提出了一个很好的观点,并基于此,我制作了一个 example,它产生了一个Monad->Applicative变压器。然而,这意味着我们需要制定一套不同的法律。
标签: haskell monads typeclass monad-transformers