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

Petr Pudlák petr.mvd at gmail.com
Wed Jan 29 13:57:03 UTC 2014


Hi,

this law apparently fails for a MonadPlus instance that has more than one
possible failure value. Consider:

   runIdentity . runErrorT $
    ((ErrorT . Identity $ Left "failure") >> mzero :: ErrorT String
Identity ())

evaluates to `Left "failure"`, which isn't equal to ErrorT's mzero `Left
""`.

This isn't just the case of ErrorT, it fails for any MonadPlus with
multiple failure values. For example

  lift (tell "foo") >> mzero :: MaybeT (Writer String) ()

is again distinct from mzero.

Actually, no monad transformer with a MonadPlus instance can satisfy the
law, because the first part in front of `>> mzero` can introduce side
effects in the underlying monad.

I'm not sure what should be the proper solution. Perhaps to change the laws
to:

  return x >> mzero  =  mzero
  (v >> mzero) >>= f  =  (v >> mzero)`

That is, if an expression ends with `mzero`, it behaves like `mzero`.

  Petr
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/libraries/attachments/20140129/733d478c/attachment.html>


More information about the Libraries mailing list