
On Wed, Feb 5, 2014 at 9:32 PM, wren ng thornton
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.
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, ~wren