MonadPlus - HaskellWiki (original) (raw)

MonadPlus class (base)

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.

mplus mzero a = a mplus a mzero = a mplus (mplus a b) c = mplus a (mplus b c)

mplus a b >>= k = mplus (a >>= k) (b >>= k)

mplus (return a) b = return a

Which satisfies what?

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.