Any refutable pattern match in do would force MonadFail (or MonadPlus if you prefer).  So<div>1.  (MonadFail m) =&gt; a -&gt; m a,   \ a -&gt; return a</div><div>2.  (MonadFail m) =&gt; m a,   mfail &quot;...&quot;</div><div>
3.  (MonadFail m) =&gt; Maybe a -&gt; m a,   \ a -&gt; case a of Nothing -&gt; mfail &quot;...&quot;; Just x -&gt; return x</div><div>4.  (Monad m) =&gt; a -&gt; b -&gt; m a,   \ a b -&gt; return a</div><div>5.  (Monad m) =&gt; (a, b) -&gt; m a,   \ (a, b) -&gt; return a</div>
<div><br></div><div>As far as type inference and desugaring goes, it seems very little would have to be changed in an implementation.</div><div><br></div><div>  -- Lennart</div><div><br><div class="gmail_quote">2010/12/15 Tillmann Rendel <span dir="ltr">&lt;<a href="mailto:rendel@informatik.uni-marburg.de">rendel@informatik.uni-marburg.de</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi John,<div class="im"><br>
<br>
John Smith wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Perhaps pattern match failures in a MonadPlus should bind to mzero - I<br>
believe that this is what your example and similar wish to achieve.<br>
</blockquote>
<br></div>
You updated the proposal to say:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
a failed pattern match should error in the same way as is does for pure code, while in<br>
MonadPlus, the current behaviour could be maintained with mzero<br>
</blockquote>
<br>
Can you be more specific as to how that would interact with polymorphism and type inference? What does it mean to be &quot;in MonadPlus&quot;? How does the compiler know?<br>
<br>
For example, what would be the static types and dynamic semantics of the following expressions:<br>
<br>
 1. \a -&gt; do {Just x &lt;- return (Just a); return x}<br>
<br>
 2. do {Just x &lt;- return Nothing; return x}<br>
<br>
 3. \a -&gt; do {Just x &lt;- a; return x}<br>
<br>
 4. \a b -&gt; do {(x, _) &lt;- return (a, b); return x}<br>
<br>
 5. \a -&gt; do {(x, _) &lt;- return a; return x}<br><font color="#888888">
<br>
    Tillmann</font><div><div></div><div class="h5"><br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">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>
</div></div></blockquote></div><br></div>