[Haskell-cafe] About mplus

David Benbennick dbenbenn at gmail.com
Wed Sep 5 00:08:46 EDT 2007

On 9/4/07, ok <ok at cs.otago.ac.nz> wrote:
> I've been thinking about making a data type an instance of MonadPlus.
>  From the Haddock documentation at haskell.org, I see that any such
> instance should satisfy
>         mzero `mplus` x = x
>         x `mplus` mzero = x
>         mzero >>= f     = mzero
>         v >> mzero      = mzero
> but is that all there is to it?  Are there no other requirements for
> MonadPlus to make sense?

Also, mplus has to be associative.  I.e.
        (a `mplus` b) `mplus` c == a `mplus` (b `mplus` c)

> I also wondered why, once MonadPlus was added to the language, the
> definition of ++ wasn't changed to
>         (++) = MonadPlus
> (with the MonadPlus instance for [] defined directly).

You mean (++) = mplus.  I've wondered that too.  Similarly, one should
define map = fmap.  And a lot of standard list functions can be
generalized to MonadPlus, for example you can define

filter :: (MonadPlus m) => (a -> Bool) -> m a -> m a

(This is not the same as filterM.)

More information about the Haskell-Cafe mailing list