On Thu, Apr 30, 2009 at 11:42 AM, Peter Verswyvelen <span dir="ltr">&lt;<a href="mailto:bugfact@gmail.com">bugfact@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Thanks Ross.<div><br></div><div>Does anyone know how to tackle this? Combining GHC&#39;s builtin arrow processor and rewrite rules?</div></blockquote><div><br>Another possibility is to make an &quot;optimizer&quot; arrow transformer that encodes the rules.  Eg.<br>
<br>data Optimize a b c where<br>    Arr :: (b -&gt; c) -&gt; Optimize a b c<br>    (:&gt;&gt;&gt;) :: Optimize a b c -&gt; Optimize a c d -&gt; Optimize a b d<br>    First :: Optimize a b c -&gt; Optimize a (b,d) (c,d)<br>
    Second :: Optimize a b c -&gt; Optimize a (b,d) (c,d)<br>    (:***) :: Optimize a b b&#39; -&gt; Optimize a c c&#39; -&gt; Optimize a (b,b&#39;) (c,c&#39;)<br> <br>optimize :: Optimize a b c -&gt; Optimize a b c<br>optimize (First f :&gt;&gt;&gt; Second g) = f :*** g<br>
...<br><br>compile :: (Arrow a) =&gt; Optimize a b c -&gt; a b c<br>compile (Arr f) = arr f<br>compile (f :&gt;&gt;&gt; g) = compile f &gt;&gt;&gt; compile g<br>...<br><br>I have of course handwaved over optimize, which will have some interesting traversal structure; esp. if you want to take advantage of the associativity of &gt;&gt;&gt;.  <br>
<br>Unfortunately, Arr is not quite transparent enough to do everything one might want with this.  e.g.,this rule cannot be encoded:<br><br>swap (x,y) = (y,x)<br>first f &gt;&gt;&gt; arr swap &gt;&gt;&gt; first g = f *** g &gt;&gt;&gt; arr swap<br>
<br>If you are serious about arrow optimizations, it might be worthwhile to modify the original preprocessor to output a richer GADT (with cases for things like ArrSwap) with all the information it knows, so that user code can experiment with optimizations.  <br>
<br>Godspeed on this interesting problem.  Please publish :-)<br><br>Luke<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div>
</div><div><div></div><div class="h5"><div><br></div><div><div class="gmail_quote">On Wed, Apr 29, 2009 at 3:43 PM, Ross Paterson <span dir="ltr">&lt;<a href="mailto:ross@soi.city.ac.uk" target="_blank">ross@soi.city.ac.uk</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;"><div>On Wed, Apr 29, 2009 at 03:07:25PM +0200, Peter Verswyvelen wrote:<br>
&gt; After doing some pragmatic tests, it seems that neither the arrow preprocessor<br>
&gt; nor GHC&#39;s builtin one generate / optimize to the (***) combinator.<br>
<br>
</div>Right, neither of them do that.  It might be possible to do that using<br>
GHC rules, but it isn&#39;t done at the moment.<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>
</blockquote></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>