Simplify desugaring of left sections
authorsimonpj@microsoft.com <unknown>
Mon, 11 Sep 2006 08:35:10 +0000 (08:35 +0000)
committersimonpj@microsoft.com <unknown>
Mon, 11 Sep 2006 08:35:10 +0000 (08:35 +0000)
MERGE TO 6.6 branch!

Some while ago I made the type checker a tiny bit more lenient about
left sections, so that
(x !)
would typecheck iff
((!) x)
typechecks.

Strictly, Haskell 98 requires that the section typechecks iff
(\y. (!) x y)
typechecks, and I should really have made the relaxation dependent on a
flag, but I didn't.

Anyway, this commit fixes the *desugarer* so that it correctly desugars
the programs that the typechecker passes.

compiler/deSugar/DsExpr.lhs

index 4c2bd3e..8dfcd30 100644 (file)
@@ -281,20 +281,10 @@ dsExpr (OpApp e1 op _ e2)
     dsLExpr e2                         `thenDs` \ y_core ->
     returnDs (mkApps core_op [x_core, y_core])
     
-dsExpr (SectionL expr op)
-  = dsLExpr op                                         `thenDs` \ core_op ->
-    -- for the type of y, we need the type of op's 2nd argument
-    let
-       (x_ty:y_ty:_, _) = splitFunTys (exprType core_op)
-       -- Must look through an implicit-parameter type; 
-       -- newtype impossible; hence Type.splitFunTys
-    in
-    dsLExpr expr                               `thenDs` \ x_core ->
-    newSysLocalDs x_ty                 `thenDs` \ x_id ->
-    newSysLocalDs y_ty                 `thenDs` \ y_id ->
-
-    returnDs (bindNonRec x_id x_core $
-             Lam y_id (mkApps core_op [Var x_id, Var y_id]))
+dsExpr (SectionL expr op)      -- Desugar (e !) to ((!) e)
+  = dsLExpr op                         `thenDs` \ core_op ->
+    dsLExpr expr                       `thenDs` \ x_core ->
+    returnDs (App core_op x_core)
 
 -- dsLExpr (SectionR op expr)  -- \ x -> op x expr
 dsExpr (SectionR op expr)