These are important questions. I think there is a trade-off between supporting many cases and having a simple desugaring. We should find a sweet-spot where the desugaring is reasonably simple and covers most idiomatic cases.<br>
<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div>So I guess it&#39;s possible to detect the pattern:</div><div><br></div><div><font face="&#39;courier new&#39;, monospace">  do x1 &lt;- foo1; ...; xN &lt;- fooN; [res &lt;-] return (f {x1..xN})</font></div>


<div><br></div><div>where {x1..xN} means &quot;x1..xN&quot; in some order&quot; </div></blockquote><div><br></div><div>Your third example shows that it&#39;s beneficial to also support duplicated variables.</div><div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div>and turn it into:</div><div><br></div><div><font face="&#39;courier new&#39;, monospace">  do [res &lt;-] (\x1..xN -&gt; f {x1..xN}) &lt;$&gt; foo1 &lt;*&gt; ... &lt;*&gt; fooN</font></div>
</blockquote><div><br></div><div>I think this is a reasonably simple rule and it covers most idiomatic cases.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">


<div>Open issues would be detection of the correct &quot;return&quot;-like thing.  </div></blockquote><div><br></div><div>I&#39;m not sure how much return aliasing is worth supporting. In general it is undecidable but we could add special cases for specialized returns (like &#39;Just&#39; instead of &#39;return&#39;) depending on how difficult it is to implement.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div>The current desugaring of do-notation is very simple because it doesn&#39;t even need to know about the monad laws.  </div>
</blockquote><div><br></div><div>Could you point out which monad law your proposed desugaring requires?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div>They are used implicitly by the optimiser (e.g., &quot;foo &gt;&gt;= \x -&gt; return x&quot; is optimised to just &quot;foo&quot; after inlining), but the desugarer doesn&#39;t need to know about them.</div></blockquote>
<div><br></div><div>Does the inliner have RULES for monad laws or why would this work?</div><div><br></div><div>Sebastian</div></div>