Difference between revisions of "MonadPlus"
Jump to navigation
Jump to search
m (Minor formatting changes) |
|||
(5 intermediate revisions by 2 users 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 mzero a = a |
|
− | + | mplus a mzero = a |
|
⚫ | |||
+ | </haskell> |
||
− | * '''Left Zero''' — < |
+ | * '''Left Zero''' — <hask>mzero</hask> is a left zero for <code>(>>=)</code>: |
+ | :<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 <code>MonadPlus</code>, 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]]. |
||
− | [[Category:Standard Classes]] |
Latest revision as of 22:55, 5 April 2021
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.