
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