Combining lambdas makes a big difference in GHC. For example f = \x. let y = E in \z. BODY The function f takes one argument, and returns a heap-allocated lambda. If E is cheap (say just a constructor) it might well be more efficient to transform to f = \xz. let y = E in BODY
Pattern matching is another example, and GHC indeed eta expands through that by default, if it makes two lambdas into one. To switch it off try -fno-do-lambda-eta-expansion. Simon | -----Original Message----- | From: glasgow-haskell-users-boun...@haskell.org [mailto:glasgow-haskell-users- | boun...@haskell.org] On Behalf Of Roman Cheplyaka | Sent: 04 October 2011 07:40 | To: glasgow-haskell-users@haskell.org | Subject: Unwanted eta-expansion | | Suppose I want a foldl which is evaluated many times on the same | list but with different folding functions. | | I would write something like this, to perform pattern-matching on the | list only once: | | module F where | myFoldl :: [a] -> (b -> a -> b) -> b -> b | myFoldl [] = \f a -> a | myFoldl (x:xs) = let y = myFoldl xs in \f a -> y f (f a x) | | However, for some reason GHC eta-expands it back. Here's what I see in | the core: | | % ghc -O2 -ddump-simpl -fforce-recomp -dsuppress-module-prefixes \ | -dsuppress-uniques -dsuppress-coercions F.hs | | ==================== Tidy Core ==================== | Rec { | myFoldl [Occ=LoopBreaker] | :: forall a b. [a] -> (b -> a -> b) -> b -> b | [GblId, Arity=3, Caf=NoCafRefs, Str=DmdType SLL] | myFoldl = | \ (@ a) (@ b) (ds :: [a]) (eta :: b -> a -> b) (eta1 :: b) -> | case ds of _ { | [] -> eta1; : x xs -> myFoldl @ a @ b xs eta (eta eta1 x) | } | end Rec } | | Why does it happen and can it be suppressed? | | This is GHC 7.0.4. | | | -- | Roman I. Cheplyaka :: http://ro-che.info/ | | _______________________________________________ | Glasgow-haskell-users mailing list | Glasgow-haskell-users@haskell.org | http://www.haskell.org/mailman/listinfo/glasgow-haskell-users _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users