Document typechecking of pattern bindings
authorSimon Peyton Jones <simonpj@microsoft.com>
Tue, 13 Dec 2011 13:31:46 +0000 (13:31 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Tue, 13 Dec 2011 13:31:46 +0000 (13:31 +0000)
compiler/typecheck/TcBinds.lhs
compiler/typecheck/TcHsType.lhs

index 224cc18..ac826b7 100644 (file)
@@ -793,6 +793,28 @@ for a non-overloaded function.
 @tcMonoBinds@ deals with a perhaps-recursive group of HsBinds.
 The signatures have been dealt with already.
 
+Note [Pattern bindings]
+~~~~~~~~~~~~~~~~~~~~~~~
+The rule for typing pattern bindings is this:
+
+    ..sigs..
+    p = e
+
+where 'p' binds v1..vn, and 'e' may mention v1..vn, 
+typechecks exactly like
+
+    ..sigs..
+    x = e       -- Inferred type
+    v1 = case x of p -> v1
+    ..
+    vn = case x of p -> vn
+
+Note that  
+    (f :: forall a. a -> a) = id
+should not typecheck because
+       case id of { (f :: forall a. a->a) -> f }
+will not typecheck.
+
 \begin{code}
 tcMonoBinds :: TcSigFun -> LetBndrSpec 
             -> RecFlag  -- Whether the binding is recursive for typechecking purposes
index 33ba9cf..3a35046 100644 (file)
@@ -1113,8 +1113,7 @@ tcPatSig ctxt sig res_ty
        -- that should be brought into scope
 
        ; if null sig_tvs then do {
-               -- The type signature binds no type variables, 
-               -- and hence is rigid, so use it to zap the res_ty
+               -- Just do the subsumption check and return
                   wrap <- tcSubType PatSigOrigin ctxt res_ty sig_ty
                ; return (sig_ty, [], wrap)
         } else do {