MonadPlus reform proposal
From HaskellWiki
(Difference between revisions)
| Line 1: | Line 1: | ||
The [[MonadPlus]] class is ambiguous: while all instances satisfy '''Monoid''' and '''Left Zero''', some such as <tt>[]</tt> satisfy '''Left Distribution''', while others such as <tt>Maybe</tt> and <tt>IO</tt> satisfy '''Left Catch'''. | The [[MonadPlus]] class is ambiguous: while all instances satisfy '''Monoid''' and '''Left Zero''', some such as <tt>[]</tt> satisfy '''Left Distribution''', while others such as <tt>Maybe</tt> and <tt>IO</tt> satisfy '''Left Catch'''. | ||
| + | |||
| + | == Proposal == | ||
It is proposed that MonadPlus be split like this: | It is proposed that MonadPlus be split like this: | ||
| Line 40: | Line 42: | ||
morelse [] b = b | morelse [] b = b | ||
morelse a b = a | morelse a b = a | ||
| + | |||
| + | [[Category:Proposals]] | ||
Revision as of 23:36, 15 January 2006
The MonadPlus class is ambiguous: while all instances satisfy Monoid and Left Zero, some such as [] satisfy Left Distribution, while others such as Maybe and IO satisfy Left Catch.
Contents |
1 Proposal
It is proposed that MonadPlus be split like this:
1.1 MonadZero
class Monad m => MonadZero m where mzero :: m a
satisfying Left Zero:
mzero >>= k = mzero
1.2 MonadPlus
class MonadZero m => MonadPlus m where mplus :: m a -> m a -> m a
satisfying Monoid and Left Distribution:
mplus mzero b = b mplus a mzero = a mplus (mplus a b) c = mplus a (mplus b c) mplus a b >>= k = mplus (a >>= k) (b >>= k)
1.3 MonadOr
class MonadZero m => MonadOr m where morelse :: m a -> m a -> m a
satisfying Monoid and Left Catch:
morelse mzero b = b morelse a mzero = a morelse (morelse a b) c = morelse a (morelse b c) morelse (return a) b = return a
2 Instances of both
Some types could be made instances of both. For instance:
instance MonadOr [] where morelse [] b = b morelse a b = a
