[Haskell-cafe] About mplus

Jules Bean jules at jellybean.co.uk
Wed Sep 5 03:58:51 EDT 2007

David Benbennick wrote:
> 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

Somehow this filter fails my intuition. Thanks to glguy on #haskell for 
showing me that you can define it as

filter p m = m >>= \x -> if p x then return x else mzero

I want filter to commute with mplus:

(filter p m) `mplus` (filter p l) === filter p (m `plus` l)

This is true for lists, and seems to me a natural requirement for filter 
to be considered, well, "a filter", along with the related filter p 
mzero == mzero. Unfortunately many of the MonadPlus instances we have 
don't satisfy that.


More information about the Haskell-Cafe mailing list