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] On Behalf Of Louis Wasserman
Sent: 09 July 2010 03:30
To: 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