On Thu, Apr 30, 2009 at 11:42 AM, Peter Verswyvelen <bugf...@gmail.com>wrote:

> Thanks Ross.
> Does anyone know how to tackle this? Combining GHC's builtin arrow
> processor and rewrite rules?
>

Another possibility is to make an "optimizer" arrow transformer that encodes
the rules.  Eg.

data Optimize a b c where
    Arr :: (b -> c) -> Optimize a b c
    (:>>>) :: Optimize a b c -> Optimize a c d -> Optimize a b d
    First :: Optimize a b c -> Optimize a (b,d) (c,d)
    Second :: Optimize a b c -> Optimize a (b,d) (c,d)
    (:***) :: Optimize a b b' -> Optimize a c c' -> Optimize a (b,b') (c,c')

optimize :: Optimize a b c -> Optimize a b c
optimize (First f :>>> Second g) = f :*** g
...

compile :: (Arrow a) => Optimize a b c -> a b c
compile (Arr f) = arr f
compile (f :>>> g) = compile f >>> compile g
...

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 >>>.

Unfortunately, Arr is not quite transparent enough to do everything one
might want with this.  e.g.,this rule cannot be encoded:

swap (x,y) = (y,x)
first f >>> arr swap >>> first g = f *** g >>> arr swap

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.

Godspeed on this interesting problem.  Please publish :-)

Luke


> On Wed, Apr 29, 2009 at 3:43 PM, Ross Paterson <r...@soi.city.ac.uk>wrote:
>
>> On Wed, Apr 29, 2009 at 03:07:25PM +0200, Peter Verswyvelen wrote:
>> > After doing some pragmatic tests, it seems that neither the arrow
>> preprocessor
>> > nor GHC's builtin one generate / optimize to the (***) combinator.
>>
>> Right, neither of them do that.  It might be possible to do that using
>> GHC rules, but it isn't done at the moment.
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe@haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to