MonadPlus
From HaskellWiki
import Control.Monad 
The MonadPlus class is defined like this:
class (Monad m) => MonadPlus m where
mzero :: m a
mplus :: m a > m a > m a
The precise set of rules that MonadPlus should obey is not agreed upon.
 Monoid —
mplus
andmzero
form a monoid:
mplus mzero a = a mplus a mzero = a mplus (mplus a b) c = mplus a (mplus b c)
 Left Zero —
mzero
is a left zero for(>>=)
:
mzero >>= k = mzero
 Left Distribution:
mplus a b >>= k = mplus (a >>= k) (b >>= k)
 Left Catch — this is rarely advocated, but Maybe and IO satisfy this as an alternative to Left Distribution.
mplus (return a) b = return a
Which satisfies what?

[]
satisfies Monoid, Left Zero, and Left Distribution.

Maybe
,IO
andSTM
satisfy Monoid, Left Zero, and Left Catch.
Which rules?
Martin & Gibbons choose Monoid, Left Zero, and Left Distribution. This makes []
a MonadPlus
, but not Maybe
or IO
.
What should be done?
It is proposed that the class be separated into MonadZero
, MonadPlus
, MonadOr
. See MonadPlus reform proposal.