The Haskell 1.4 Report states that instances of MonadZero and MonadPlus should satisfy these laws: m >> zero = zero zero >>= m = zero m ++ zero = m zero ++ m = m Now that MonadPlus has been moved out of the Prelude (and has changed the names of all its operators), I see that no mention of these laws is in section 10.2 of the Haskell 98 Library Report. I assume this is inadvertent and that instances of MonadPlus should still satisfy these laws. But I have a question: Would it be reasonable to expect any instance of MonadPlus to satisfy the following law (using `mplus', not ++ now)? m >>= (\x->f x `mplus` g x) = (m >>= f) `mplus` (m >>= g) It is true for the Maybe and list instances. Can anyone give me a reasonable instance of MonadPlus which wouldn't satisfy this but does satisfy the above four laws? Or, is there some deep reason why this "should" be true? Thanks. - Mark