[Haskell-cafe] Re: what is inverse of mzero and return?
Ashley Yakeley
ashley at semantic.org
Fri Jan 21 21:16:04 EST 2005
In article <Pine.WNT.4.61.0501211845490.1272 at philo>,
"S. Alexander Jacobson" <alex at alexjacobson.com> wrote:
> I assume there is a standard name for this
> class/function:
>
> instance Foo [] where
> foo [] = mzero
> foo (x:_) = return x
>
> instance Foo (Maybe x) where
> foo Nothing = mzero
> foo Just x = return x
I don't believe so. I had to write my own classes to do this sort of
thing.
This is also a good opporunity to point out an ambiguity in the standard
MonadPlus class. All instances satisfy these:
mplus mzero a = a
mplus a mzero = a
But only some instances (such as []) satisfy this:
(mplus a b) >>= c = mplus (a >>= c) (b >>= c)
Other instances (IO, Maybe) satisfy this:
mplus (return a) b = return a
I think mplus should be separated into two functions. This code shows
the difference a bit more clearly:
do
b <- mplus (return True) (return False)
if b then mzero else return ()
For the first kind this is the same as "return ()", for the second kind
it's the same as "mzero".
--
Ashley Yakeley, Seattle WA
More information about the Haskell-Cafe
mailing list