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.louis@gmail.com
http://profiles.google.com/wasserman.louis