【发布时间】:2014-05-26 06:43:29
【问题描述】:
我试图了解MonadPlus 背后的动机。如果已经有类型类Monad 和Monoid,为什么还需要?
当然,Monoid 的实例是具体类型,而Monad 的实例需要单个类型参数。 (请参阅Monoid vs MonadPlus 以获得有用的解释。)但是你不能重写任何类型约束
(MonadPlus m) => ...
作为Monad 和Monoid 的组合?
(Monad m, Monoid (m a)) => ...
以Control.Monad 中的guard 函数为例。它的实现是:
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
我只能使用 Monad 和 Monoid 来实现它:
guard' :: (Monad m, Monoid (m ())) => Bool -> m ()
guard' True = return ()
guard' False = mempty
有人可以澄清MonadPlus 和Monad + Monoid 之间的真正区别吗?
【问题讨论】:
标签: haskell monads monoids monadplus