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 http://profiles.google.com/wasserman.louis On Tue, Jul 13, 2010 at 10:06 AM, Louis Wasserman <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 > http://profiles.google.com/wasserman.louis > > > On Tue, Jul 13, 2010 at 9:09 AM, Simon Peyton-Jones <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] *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 >> 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