I'm trying to understand the motivation behind the MonadPlus
. Why is it necessary if there are already the typeclasses Monad
and Monoid
?
Granted, instances of Monoid
are concrete types, whereas instances of Monad
require a single type parameter. (See Monoid vs MonadPlus for a helpful explanation.) But couldn't you rewrite any type constraint of
(MonadPlus m) => ...
as a combination of Monad
and Monoid
?
(Monad m, Monoid (m a)) => ...
Take the guard
function from Control.Monad
, for example. Its implementation is:
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
I was able to implement it using only Monad
and Monoid
:
guard' :: (Monad m, Monoid (m ())) => Bool -> m ()
guard' True = return ()
guard' False = mempty
Could someone please clarify the real difference between MonadPlus
and Monad
+ Monoid
?