Personal tools

MonadPlus

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
m (clean up)
m (Remove Category:Standard classes - now in template)
 
Line 45: Line 45:
   
 
It is proposed that the class be separated into <hask>MonadZero</hask>, <hask>MonadPlus</hask>, <hask>MonadOr</hask>. See [[MonadPlus reform proposal]].
 
It is proposed that the class be separated into <hask>MonadZero</hask>, <hask>MonadPlus</hask>, <hask>MonadOr</hask>. See [[MonadPlus reform proposal]].
 
[[Category:Standard classes]]
 

Latest revision as of 02:40, 31 July 2008

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.

  • Monoid
    mplus
    and
    mzero
    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

[edit] 1 Which satisfies what?

[]
satisfies Monoid, Left Zero, and Left Distribution.
Maybe
,
IO
and
STM
satisfy Monoid, Left Zero, and Left Catch.

[edit] 2 Which rules?

Martin & Gibbons choose Monoid, Left Zero, and Left Distribution. This makes
[]
a MonadPlus, but not
Maybe
or
IO
.

[edit] 3 What should be done?

It is proposed that the class be separated into
MonadZero
,
MonadPlus
,
MonadOr
. See MonadPlus reform proposal.