incorrect MonadPlus law "v >> mzero = mzero"?

wren ng thornton winterkoninkje at
Thu Feb 6 03:05:29 UTC 2014

On Wed, Feb 5, 2014 at 9:32 PM, wren ng thornton
<winterkoninkje at> wrote:
> I still think the above laws are the most sensible ones. I discuss a
> bit about why I believe that in this blog post I just posted[1]. The
> only alternative I see is to drop every law about how mplus interacts
> with bind, which isn't a solution quite so much as giving up.
> [1] <>

I had commented in that post about how the generalization of the
distributivity law could possibly lead to problems, but didn't really
explore it. I just now posted an addendum showing that (for
Maybe/MaybeT) it is indeed the generalization itself which causes the
problems; and that, if we use the *exact* distributivity law from
seminearrings[2] rather than the generalized version, then the problem
goes away (for Maybe). I still submit that this is the right law to
have, following the same overall justification as before. The
generalized law is nice, but I wouldn't be too sad about using the
non-generalized law instead.

Any IO/STM examples which break the non-generalized law?

[2] That is,

    mzero >>= f  =  mzero  -- this one is still generalized

    (x `mplus` y) >> z  =  (x >> z) `mplus` (y >> z)  -- no longer generalized

    (x `mplus` y) `mplus` z  =  x `mplus` (y `mplus` z)

    x `mplus` mzero  =  x

    mzero `mplus` y  =  y

Live well,

More information about the Libraries mailing list