MonadPlus
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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.