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.

Jules

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to