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

Reply via email to