MonadPlus
From HaskellWiki
(Difference between revisions)
m (Remove Category:Standard classes - now in template) |
|||
(4 intermediate revisions by one user not shown) | |||
Line 2: | Line 2: | ||
The '''MonadPlus''' class is defined like this: | The '''MonadPlus''' class is defined like this: | ||
− | + | <haskell> | |
+ | class (Monad m) => MonadPlus m where | ||
mzero :: m a | mzero :: m a | ||
mplus :: m a -> m a -> m a | mplus :: m a -> m a -> m a | ||
+ | </haskell> | ||
The precise set of rules that MonadPlus should obey is not agreed upon. | The precise set of rules that MonadPlus should obey is not agreed upon. | ||
− | * '''Monoid''' — < | + | * '''Monoid''' — <hask>mplus</hask> and <hask>mzero</hask> form a monoid: |
− | + | <haskell> | |
− | + | mplus mzero a = a | |
− | + | mplus a mzero = a | |
+ | mplus (mplus a b) c = mplus a (mplus b c) | ||
+ | </haskell> | ||
− | * '''Left Zero''' — < | + | * '''Left Zero''' — <hask>mzero</hask> is a left zero for <tt>>>=</tt>: |
− | + | <haskell> | |
+ | mzero >>= k = mzero | ||
+ | </haskell> | ||
* '''Left Distribution''': | * '''Left Distribution''': | ||
− | + | <haskell> | |
+ | mplus a b >>= k = mplus (a >>= k) (b >>= k) | ||
+ | </haskell> | ||
* '''Left Catch''' — this is rarely advocated, but <tt>Maybe</tt> and <tt>IO</tt> satisfy this as an alternative to '''Left Distribution'''. | * '''Left Catch''' — this is rarely advocated, but <tt>Maybe</tt> and <tt>IO</tt> satisfy this as an alternative to '''Left Distribution'''. | ||
− | + | <haskell> | |
+ | mplus (return a) b = return a | ||
+ | </haskell> | ||
+ | |||
+ | === Which satisfies what? === | ||
+ | |||
+ | <hask>[]</hask> satisfies '''Monoid''', '''Left Zero''', and '''Left Distribution'''. | ||
+ | |||
+ | <hask>Maybe</hask>, <hask>IO</hask> and <hask>STM</hask> satisfy '''Monoid''', '''Left Zero''', and '''Left Catch'''. | ||
== Which rules? == | == Which rules? == | ||
− | [http://web.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/tactics.pdf Martin & Gibbons] choose '''Monoid''', '''Left Zero''', and '''Left Distribution'''. This makes < | + | [http://web.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/tactics.pdf Martin & Gibbons] choose '''Monoid''', '''Left Zero''', and '''Left Distribution'''. This makes <hask>[]</hask> a MonadPlus, but not <hask>Maybe</hask> or <hask>IO</hask>. |
+ | |||
+ | == What should be done? == | ||
− | [[ | + | It is proposed that the class be separated into <hask>MonadZero</hask>, <hask>MonadPlus</hask>, <hask>MonadOr</hask>. See [[MonadPlus reform proposal]]. |
Latest revision as of 02:40, 31 July 2008
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 — andmplusform a monoid:mzero
mplus mzero a = a mplus a mzero = a mplus (mplus a b) c = mplus a (mplus b c)
- Left Zero — is a left zero for >>=:mzero
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?
[]
Maybe
IO
STM
[edit] 2 Which rules?
Martin & Gibbons choose Monoid, Left Zero, and Left Distribution. This makes[]
Maybe
IO
[edit] 3 What should be done?
It is proposed that the class be separated intoMonadZero
MonadPlus
MonadOr