now I understand. I've created a Trac ticket.  Shouldn't be hard.
                http://hackage.haskell.org/trac/ghc/ticket/4201
Thanks

Simon


From: glasgow-haskell-users-boun...@haskell.org 
[mailto:glasgow-haskell-users-boun...@haskell.org] On Behalf Of Louis Wasserman
Sent: 13 July 2010 17:46
To: Simon Peyton-Jones
Cc: glasgow-haskell-users@haskell.org
Subject: Re: Casting + eta reduction

Or a different way:

I want -fdo-lambda-eta-expansion (which, if I understand correctly, actually 
triggers eta *reduction*) to eliminate argument casts, as well.

My motivation:  I'm working on a generalized trie library, and due to 
http://hackage.haskell.org/trac/ghc/ticket/4185, I can't use 
GeneralizedNewtypeDeriving to minimize the overhead of a stack of about 20 
newtypes, each with their own class instance, even if I wasn't trying to use 
Template Haskell, which currently has no syntax for doing 
GeneralizedNewtypeDeriving on multi-parameter type classes (it only derives 
single-argument type classes.)  As it stands, I have a lot of methods that 
compile to

foo f = bar (\ x -> f (x `cast` a))

and they stack 20 deep, which means I have to do 20 allocations (\ x -> f (x 
`cast` a)) for even the most simple methods.  What I'd like to see is this 
getting reduced to

foo  = bar `cast` (...)

which would reduce my overhead significantly.

Louis Wasserman
wasserman.lo...@gmail.com<mailto:wasserman.lo...@gmail.com>
http://profiles.google.com/wasserman.louis

On Tue, Jul 13, 2010 at 10:06 AM, Louis Wasserman 
<wasserman.lo...@gmail.com<mailto:wasserman.lo...@gmail.com>> wrote:
Mmmm, let's give a slightly different example:

foo :: Foo -> Int
foo (Foo a) = a + 1

bar :: Int -> Int
bar = foo . Foo

and I'd expect bar to be replaced with (foo `cast` (Int -> Int)) and inlined, 
eliminating an allocation.  In general, we'd get the equivalent of the 
no-allocation versions of GeneralizedNewtypeDeriving instances, so long as we 
could write them out for ourselves.

Louis Wasserman
wasserman.lo...@gmail.com<mailto:wasserman.lo...@gmail.com>
http://profiles.google.com/wasserman.louis

On Tue, Jul 13, 2010 at 9:09 AM, Simon Peyton-Jones 
<simo...@microsoft.com<mailto:simo...@microsoft.com>> wrote:
It compiles to

lift f d = f (d `cast` blah)

which seems fine to me.  Are you unhappy with that?

Simon

From: 
glasgow-haskell-users-boun...@haskell.org<mailto:glasgow-haskell-users-boun...@haskell.org>
 
[mailto:glasgow-haskell-users-boun...@haskell.org<mailto:glasgow-haskell-users-boun...@haskell.org>]
 On Behalf Of Louis Wasserman
Sent: 09 July 2010 03:30
To: glasgow-haskell-users@haskell.org<mailto:glasgow-haskell-users@haskell.org>
Subject: Casting + eta reduction

Consider

newtype Foo = Foo Int

lift :: (Int -> a) -> Foo -> a
lift f (Foo x) = f x

Now, I'd expect this to compile with -O2 down to something like

lift f = f `cast` (Foo -> a)

but it doesn't.

It seems that GeneralizedNewtypeDeriving assumes that these two things *are* 
equivalent, and it just directly casts the class dictionary.  The implication 
would be that that GeneralizedNewtypeDeriving gives more efficient instances 
than you could *possibly* get if you wrote them by hand, which is very sad.

Louis Wasserman
wasserman.lo...@gmail.com<mailto:wasserman.lo...@gmail.com>
http://profiles.google.com/wasserman.louis


_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to