我试图了解背后的动机MonadPlus
。Monad
如果已经有 typeclasses和 ,为什么还有必要Monoid
?
当然,实例Monoid
是具体类型,而实例Monad
需要单个类型参数。(请参阅Monoid vs MonadPlus以获得有用的解释。)但是你不能重写任何类型约束
(MonadPlus m) => ...
作为和的Monad
组合Monoid
?
(Monad m, Monoid (m a)) => ...
以 的guard
函数Control.Monad
为例。它的实现是:
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
我只能使用Monad
and来实现它Monoid
:
guard' :: (Monad m, Monoid (m ())) => Bool -> m ()
guard' True = return ()
guard' False = mempty
MonadPlus
有人可以澄清和Monad
+之间的真正区别Monoid
吗?