Arrows and GHC rewrite rules

Simon Peyton-Jones simonpj at microsoft.com
Fri Mar 30 10:37:53 EDT 2007


Well observed. There are two difficulties here.

First is a persistent bug-bear: GHC compiles

        foo :: SF (Int,Int) (Int,Int)
        foo = first (arr (+1)) >>> first (arr (+2) >>> arr (+3))

thus:

        dsf :: Arrow SF
        dsf = ...

        first_1 = Control.Arrow.first SF dsf
        arr_1 = Control.Arrow.arr SF dsf

        foo = first_1 (arr_1 (+1)) ...etc...

GHC is trying to get more sharing by sharing the computation for selecting the 'first' method of dsf.  But getting this sharing (which is worth little) defeats the rule, since there is no occurrence of the pattern the rule looks for.

You can switch off this (dubious) sharing optimisation with -fno-method-sharing.

Would someone care to document this at
        http://haskell.org/haskellwiki/GHC/Using_rules


The second is a plain bug: RULES for class methods are not being exported at all.  So they aren't getting outside of Control.Arrow at the moment.  I'm committing a patch right now.

Simon


| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-users-bounces at haskell.org] On
| Behalf Of Eric Cheng
| Sent: 30 March 2007 03:35
| To: glasgow-haskell-users at haskell.org
| Subject: Arrows and GHC rewrite rules
|
| In GHC's Control.Arrow implementation, there are several rewrite rules
| which exploit some properties of arrows.  For example,
|
| > "compose/arr" forall f g . arr f >>> arr g = arr (f >>> g)
| > "first/arr"   forall f . first (arr f) = arr (first f)
| > "second/arr"  forall f . second (arr f) = arr (second f)
|
| ... and so forth.
|
| Now say I have a simple arrow instance:
|
| > newtype SF a b = SF ([a] -> [b])
| >
| > instance Arrow SF where
| >    arr f = SF (map f)
| >
| >    first (SF f) = SF g
| >       where g l = let (x, y) = unzip l
| >                    in zip (f x) y
| >
| >    (SF f) >>> (SF g) = SF (g . f)
|
| and some arrow composition:
|
| > foo :: SF (Int,Int) (Int,Int)
| > foo = first (arr (+1)) >>> first (arr (+2) >>> arr (+3))
|
| I was expecting that ghc would at least make use of compose/arr or
| even first/arr, but it didn't appear to be the case.  I was using
| ghc-6.6, and -ddump-simpl-stats showed a bunch of list-specific rules
| were fired (map, mapFB, fold/build, etc), but I did not see any
| arrow-related rules being applied.
|
| Were the rewrite rules subsumed by inlining or beta-reduction?  Am I
| missing something here?
|
| Thanks,
| Eric
| _______________________________________________
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users


More information about the Glasgow-haskell-users mailing list