<div dir="ltr"><div>Indeed this issue is not limited merely to multiple failure values.</div><div><br></div><div>    >>> runMaybeT $ lift (putStrLn "effect") >> mzero</div><div>    effect</div><div>

    >>> runMaybeT mzero</div><div><br></div><div><br></div><div>So you're right. This law is being violated </div></div><div class="gmail_extra"><br clear="all"><div>-- Dan Burton</div>
<br><br><div class="gmail_quote">On Mon, Feb 3, 2014 at 12:21 PM, Petr Pudlák <span dir="ltr"><<a href="mailto:petr.mvd@gmail.com" target="_blank">petr.mvd@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr">Since nobody replied so far, I'm also forwarding to cafe.<span class="HOEnZb"><font color="#888888"><br>Petr</font></span><div><div class="h5"><br><br><div class="gmail_quote">---------- Forwarded message ----------<br>

From: <b class="gmail_sendername">Petr Pudlák</b> <span dir="ltr"><<a href="mailto:petr.mvd@gmail.com" target="_blank">petr.mvd@gmail.com</a>></span><br>

Date: 2014-01-29<br>Subject: incorrect MonadPlus law "v >> mzero = mzero"?<br>To: "<a href="mailto:libraries@haskell.org" target="_blank">libraries@haskell.org</a>" <<a href="mailto:libraries@haskell.org" target="_blank">libraries@haskell.org</a>><br>



<br><br><div dir="ltr">Hi,<br><br>this law apparently fails for a MonadPlus instance that has more than one possible failure value. Consider:<br><br>   runIdentity . runErrorT $<br>    ((ErrorT . Identity $ Left "failure") >> mzero :: ErrorT String Identity ())<br>




<br>evaluates to `Left "failure"`, which isn't equal to ErrorT's mzero `Left ""`.<br><br>This isn't just the case of ErrorT, it fails for any MonadPlus with multiple failure values. For example<br>




<br>  lift (tell "foo") >> mzero :: MaybeT (Writer String) ()<br><br>is again distinct from mzero.<br><br>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.<br>




<br>I'm not sure what should be the proper solution. Perhaps to change the laws to:<br><br>  return x >> mzero  =  mzero<br>  (v >> mzero) >>= f  =  (v >> mzero)`<br><br>That is, if an expression ends with `mzero`, it behaves like `mzero`.<span><font color="#888888"><br>




<br>  Petr<br></font></span></div>
</div><br></div></div></div>
<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br></div>