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 —
mzeroform a monoid:
mplus mzero a = a mplus a mzero = a mplus (mplus a b) c = mplus a (mplus b c)
- Left Zero —
mzerois 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.
STMsatisfy Monoid, Left Zero, and Left Catch.
Martin & Gibbons choose Monoid, Left Zero, and Left Distribution. This makes
MonadPlus, but not
What should be done?
It is proposed that the class be separated into
MonadOr. See MonadPlus reform proposal.