Good trick. I just added &#39;ado&#39; to my little scheme monad library. ;)<br><br>-Edward Kmett<br><br><div class="gmail_quote">On Fri, Oct 9, 2009 at 1:06 PM, Philippa Cowderoy <span dir="ltr">&lt;<a href="mailto:flippa@flippac.org">flippa@flippac.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I do a lot of work with parsers, and want to do more using Applicatives. That said, I&#39;m finding it a little tedious being forced to use pointless style for a task that&#39;s well-suited to having a few names around. The idea of an applicative do notation&#39;s been kicked around on #haskell a few times (I can&#39;t find any trace of it on the mailing list, but I confess to not having searched too hard), so I thought I&#39;d propose it here.<br>

<br>
The basic idea is to turn this:<br>
<br>
do a &lt;- f<br>
  g<br>
  b &lt;- h<br>
  pure $ foo a b<br>
<br>
into this:<br>
<br>
(\a b -&gt; pure $ foo a b) &lt;*&gt; (f &lt;*&gt; g *&gt; h)<br>
<br>
Aside from changing &gt;&gt;= and &gt;&gt; into &lt;*&gt; and *&gt;, the most significant difference from monadic do is that all the generated lambda abstractions go in front of the final &quot;return&quot; statement which is then fmapped across the rest of the code. Bindings are thus only in scope in the &quot;return&quot; statement. I believe sugared let statements can be handled similarly so long as they respect the binding discipline.<br>

<br>
This leads us to the bikeshed topic: what&#39;s the concrete syntax? The obvious way is to replace do with a new keyword - for example, ado for &quot;applicative do&quot;. There&#39;s a nice alternative though: we can check whether a do statement meets the binding rules for an applicative block and treat it as one if so, or a monadic one if not. While not all Monads are Applicatives, code can readily be changed back using the WrappedMonad newtype - whereas existing code needn&#39;t turn on the appropriate extension in the first place.<br>

<br>
Thoughts, comments?<br><font color="#888888">
<br>
-- <br>
<a href="mailto:flippa@flippac.org" target="_blank">flippa@flippac.org</a><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>
</font></blockquote></div><br>