<div><br><div class="gmail_quote">On 5 September 2011 13:41, Sebastian Fischer <span dir="ltr">&lt;<a href="mailto:fischer@nii.ac.jp">fischer@nii.ac.jp</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Hi again,<div><br></div><div>I think the following rules capture what Max&#39;s program does if applied after the usual desugaring of do-notation:</div><div><br></div><div><div>a &gt;&gt;= \p -&gt; return b</div><div> --&gt;</div>


<div>(\p -&gt; b) &lt;$&gt; a</div><div><br></div><div>a &gt;&gt;= \p -&gt; f &lt;$&gt; b -- &#39;free p&#39; and &#39;free b&#39; disjoint</div><div> --&gt;</div><div>((\p -&gt; f) &lt;$&gt; a) &lt;*&gt; b</div></div></blockquote>

<div><br></div><div>Will there also be an optimisation for some sort of simple patterns?  I.e., where we could rewrite this to: </div><div><br></div><div>  liftA2 (\pa pb -&gt; f ...) a b</div><div><br></div><div>I think I remember someone saying that the one-at-a-time application of &lt;*&gt; inhibits certain optimisations.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div><br>
</div><div>a &gt;&gt;= \p -&gt; f &lt;$&gt; b -- &#39;free p&#39; and &#39;free f&#39; disjoint</div><div> --&gt;</div><div>f &lt;$&gt; (a &gt;&gt;= \p -&gt; b)</div><div><br></div><div>a &gt;&gt;= \p -&gt; b &lt;*&gt; c -- &#39;free p&#39; and &#39;free c&#39; disjoint</div>


<div> --&gt;</div><div>(a &gt;&gt;= \p -&gt; b) &lt;*&gt; c</div><div><br></div><div>a &gt;&gt;= \p -&gt; b &gt;&gt;= \q -&gt; c -- &#39;free p&#39; and &#39;free b&#39; disjoint</div><div> --&gt;</div><div>liftA2 (,) a b &gt;&gt;= \(p,q) -&gt; c</div>


<div><br></div><div>a &gt;&gt;= \p -&gt; b &gt;&gt; c -- &#39;free p&#39; and &#39;free b&#39; disjoint</div><div> --&gt;</div><div>(a &lt;&lt; b) &gt;&gt;= \p -&gt; c</div></div></blockquote><div><br></div><div>I find (a &lt;&lt; b) confusing.  The intended semantics seem to be &quot;effect a&quot;, then &quot;effect b&quot;, return result of &quot;a&quot;.  That doesn&#39;t seem intuitive to me because it contradicts with the effect ordering of (=&lt;&lt;) which reverses the effect ordering of (&gt;&gt;=).  We already have (&lt;*) and (*&gt;) for left-to-right effect ordering and pointed result selection.  I understand that (&gt;&gt;) = (*&gt;) apart from the Monad constraint, but I would prefer not to have (&lt;&lt;) = (&lt;*). </div>

<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div><br></div><div>The second and third rule overlap and should be applied in this order. &#39;free&#39; gives all free variables of a pattern &#39;p&#39; or an expression &#39;a&#39;,&#39;b&#39;,&#39;c&#39;, or &#39;f&#39;.</div>


<div><br></div><div>If return, &gt;&gt;, and &lt;&lt; are defined in Applicative, I think the rules also achieve the minimal necessary class constraint for Thomas&#39;s examples that do not involve aliasing of return.</div>


<div><br></div><font color="#888888"><div>Sebastian</div></font><div><div></div><div class="h5"><br><div class="gmail_quote">On Mon, Sep 5, 2011 at 5:37 PM, Sebastian Fischer <span dir="ltr">&lt;<a href="mailto:fischer@nii.ac.jp" target="_blank">fischer@nii.ac.jp</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Max, <div><br></div><div>thanks for you proposal!<br><br><div class="gmail_quote"><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>Using the Applicative methods to optimise &quot;do&quot; desugaring is still</div>




possible, it&#39;s just not that easy to have that weaken the generated<br>
constraint from Monad to Applicative since only degenerate programs<br>
like this one won&#39;t use a Monad method:<br></blockquote><div><br></div></div><div>Is this still true, once Monad is a subclass of Applicative which defines return?</div><div><br></div><div>I&#39;d still somewhat prefer if return get&#39;s merged with the preceding statement so sometimes only a Functor constraint is generated but I think, I should adjust your desugaring then..</div>



<div><br></div><font color="#888888"><div>Sebastian</div></font></div><br></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Push the envelope. Watch it bend.<br>
</div>