我试图理解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
之间的真正区别?
MonadPlus
和Monoid
之间的区别并不重要。 - Toxaris