Do not apply eta expansion to application arguments.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Tue, 23 Jun 2009 12:24:26 +0000 (14:24 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Tue, 23 Jun 2009 12:24:26 +0000 (14:24 +0200)
Doing this can introduce expressions such as:
  map (\x -> foo x) xs
which is of course not really what we want. By limiting eta expansion in
this way, we'll still get it where we really want it: At the top level.

Normalize.hs
NormalizeTools.hs

index 9aedb4b856a17f8292241262df1f9622527efb9a..cceefc0cf7baf76c4135da6ef12cc7f9c5922988 100644 (file)
@@ -43,13 +43,14 @@ import Pretty
 -- η abstraction
 --------------------------------
 eta, etatop :: Transform
+eta expr | is_fun expr && not (is_lam expr) = do
 eta expr | is_fun expr && not (is_lam expr) = do
   let arg_ty = (fst . Type.splitFunTy . CoreUtils.exprType) expr
   id <- mkInternalVar "param" arg_ty
   change (Lam id (App expr (Var id)))
 -- Leave all other expressions unchanged
 eta e = return e
-etatop = notapplied ("eta", eta)
+etatop = notappargs ("eta", eta)
 
 --------------------------------
 -- β-reduction
index 14e3faca07543f497da404cd8e5cb317c7e6d099..400bf88bfa503e12232ef5ddac1ff8868b01c20b 100644 (file)
@@ -146,22 +146,22 @@ subeverywhere trans (Case scrut b t alts) = do
 
 subeverywhere trans expr = return expr
 
--- Apply the given transformation to all expressions, except for every first
--- argument of an application.
-notapplied :: (String, Transform) -> Transform
-notapplied trans = applyboth (subnotapplied trans) trans
+-- Apply the given transformation to all expressions, except for direct
+-- arguments of an application
+notappargs :: (String, Transform) -> Transform
+notappargs trans = applyboth (subnotappargs trans) trans
 
 -- Apply the given transformation to all (direct and indirect) subexpressions
--- (but not the expression itself), except for the first argument of an
--- applicfirst argument of an application
-subnotapplied :: (String, Transform) -> Transform
-subnotapplied trans (App a b) = do
-  a' <- subnotapplied trans a
-  b' <- notapplied trans b
+-- (but not the expression itself), except for direct arguments of an
+-- application
+subnotappargs :: (String, Transform) -> Transform
+subnotappargs trans (App a b) = do
+  a' <- subnotappargs trans a
+  b' <- subnotappargs trans b
   return $ App a' b'
 
 -- Let subeverywhere handle all other expressions
-subnotapplied trans expr = subeverywhere (notapplied trans) expr
+subnotappargs trans expr = subeverywhere (notappargs trans) expr
 
 -- Runs each of the transforms repeatedly inside the State monad.
 dotransforms :: [Transform] -> CoreExpr -> TransformSession CoreExpr