2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[TcMatches]{Typecheck some @Matches@}
7 module TcMatches ( tcMatchesFun, tcGRHSsPat, tcMatchesCase, tcMatchLambda,
9 tcDoStmts, tcStmtsAndThen, tcStmts, tcThingWithSig,
11 TcStmtCtxt(..), TcMatchCtxt(..)
14 #include "HsVersions.h"
16 import {-# SOURCE #-} TcExpr( tcCheckRho, tcInferRho, tcMonoExpr )
18 import HsSyn ( HsExpr(..), LHsExpr, MatchGroup(..),
19 Match(..), LMatch, GRHSs(..), GRHS(..),
20 Stmt(..), LStmt, HsMatchContext(..), HsStmtContext(..),
21 ReboundNames, LPat, HsBindGroup(..),
23 pprMatchContext, pprStmtContext, pprStmtResultContext,
24 collectPatsBinders, glueBindsOnGRHSs
26 import TcHsSyn ( ExprCoFn, isIdCoercion, (<$>), (<.>) )
29 import TcHsType ( tcHsPatSigType, UserTypeCtxt(..) )
30 import Inst ( tcSyntaxName, tcInstCall )
31 import TcEnv ( TcId, tcLookupLocalIds, tcLookupId, tcExtendIdEnv,
33 import TcPat ( PatCtxt(..), tcPats )
34 import TcMType ( newTyFlexiVarTy, newTyFlexiVarTys, zonkTcType )
35 import TcType ( TcType, TcTyVar, TcSigmaType, TcRhoType, mkFunTys,
36 tyVarsOfTypes, tidyOpenTypes, isSigmaTy, mkTyConApp,
37 liftedTypeKind, openTypeKind, mkArrowKind, mkAppTy )
38 import TcBinds ( tcBindsAndThen )
39 import TcUnify ( Expected(..), zapExpectedType, readExpectedType,
40 unifyTauTy, subFunTys, unifyListTy, unifyTyConApp,
41 checkSigTyVarsWrt, zapExpectedBranches, tcSubExp, tcGen,
43 import TcSimplify ( bindInstsOfLocalFuns )
45 import TysWiredIn ( boolTy, parrTyCon, listTyCon )
46 import Id ( idType, mkLocalId )
47 import CoreFVs ( idFreeTyVars )
49 import BasicTypes ( RecFlag(..) )
50 import Util ( isSingleton, notNull )
52 import SrcLoc ( Located(..), noLoc )
57 %************************************************************************
59 \subsection{tcMatchesFun, tcMatchesCase}
61 %************************************************************************
63 @tcMatchesFun@ typechecks a @[Match]@ list which occurs in a
64 @FunMonoBind@. The second argument is the name of the function, which
65 is used in error messages. It checks that all the equations have the
66 same number of arguments before using @tcMatches@ to do the work.
71 -> Expected TcRhoType -- Expected type of function
72 -> TcM (MatchGroup TcId) -- Returns type of body
74 tcMatchesFun fun_name matches exp_ty
75 = do { -- Check that they all have the same no of arguments
76 -- Location is in the monad, set the caller so that
77 -- any inter-equation error messages get some vaguely
78 -- sensible location. Note: we have to do this odd
79 -- ann-grabbing, because we don't always have annotations in
80 -- hand when we call tcMatchesFun...
81 checkTc (sameNoOfArgs matches) (varyingArgsErr fun_name matches)
83 -- ToDo: Don't use "expected" stuff if there ain't a type signature
84 -- because inconsistency between branches
85 -- may show up as something wrong with the (non-existent) type signature
87 -- This is one of two places places we call subFunTys
88 -- The point is that if expected_y is a "hole", we want
89 -- to make pat_tys and rhs_ty as "holes" too.
90 ; exp_ty' <- zapExpectedBranches matches exp_ty
91 ; subFunTys matches exp_ty' $ \ pat_tys rhs_ty ->
92 tcMatches match_ctxt pat_tys rhs_ty matches
95 match_ctxt = MC { mc_what = FunRhs fun_name,
96 mc_body = tcMonoExpr }
99 @tcMatchesCase@ doesn't do the argument-count check because the
100 parser guarantees that each equation has exactly one argument.
103 tcMatchesCase :: TcMatchCtxt -- Case context
104 -> TcRhoType -- Type of scrutinee
105 -> MatchGroup Name -- The case alternatives
106 -> Expected TcRhoType -- Type of whole case expressions
107 -> TcM (MatchGroup TcId) -- Translated alternatives
109 tcMatchesCase ctxt scrut_ty matches exp_ty
110 = do { exp_ty' <- zapExpectedBranches matches exp_ty
111 ; tcMatches ctxt [Check scrut_ty] exp_ty' matches }
113 tcMatchLambda :: MatchGroup Name -> Expected TcRhoType -> TcM (MatchGroup TcId)
114 tcMatchLambda match exp_ty -- One branch so no unifyBranches needed
115 = subFunTys match exp_ty $ \ pat_tys rhs_ty ->
116 tcMatches match_ctxt pat_tys rhs_ty match
118 match_ctxt = MC { mc_what = LambdaExpr,
119 mc_body = tcMonoExpr }
122 @tcGRHSsPat@ typechecks @[GRHSs]@ that occur in a @PatMonoBind@.
125 tcGRHSsPat :: GRHSs Name
126 -> Expected TcRhoType
128 tcGRHSsPat grhss exp_ty = tcGRHSs match_ctxt grhss exp_ty
130 match_ctxt = MC { mc_what = PatBindRhs,
131 mc_body = tcMonoExpr }
135 %************************************************************************
139 %************************************************************************
142 tcMatches :: TcMatchCtxt
143 -> [Expected TcRhoType] -- Expected pattern types
144 -> Expected TcRhoType -- Expected result-type of the Match.
146 -> TcM (MatchGroup TcId)
148 data TcMatchCtxt -- c.f. TcStmtCtxt, also in this module
149 = MC { mc_what :: HsMatchContext Name, -- What kind of thing this is
150 mc_body :: LHsExpr Name -- Type checker for a body of an alternative
151 -> Expected TcRhoType
152 -> TcM (LHsExpr TcId) }
154 tcMatches ctxt pat_tys rhs_ty (MatchGroup matches _)
155 = do { matches' <- mapM (tcMatch ctxt pat_tys rhs_ty) matches
156 ; pat_tys' <- mapM readExpectedType pat_tys
157 ; rhs_ty' <- readExpectedType rhs_ty
158 ; return (MatchGroup matches' (mkFunTys pat_tys' rhs_ty')) }
161 tcMatch :: TcMatchCtxt
162 -> [Expected TcRhoType] -- Expected pattern types
163 -> Expected TcRhoType -- Expected result-type of the Match.
167 tcMatch ctxt pat_tys rhs_ty match
168 = wrapLocM (tc_match ctxt pat_tys rhs_ty) match
170 tc_match ctxt pat_tys rhs_ty match@(Match pats maybe_rhs_sig grhss)
171 = addErrCtxt (matchCtxt (mc_what ctxt) match) $
172 do { (pats', grhss') <- tcMatchPats pats pat_tys rhs_ty $
173 tc_grhss ctxt maybe_rhs_sig grhss rhs_ty
174 ; returnM (Match pats' Nothing grhss') }
178 tc_grhss ctxt Nothing grhss rhs_ty
179 = tcGRHSs ctxt grhss rhs_ty -- No result signature
181 tc_grhss ctxt (Just res_sig) grhss rhs_ty
182 = do { (sig_tvs, sig_ty) <- tcHsPatSigType ResSigCtxt res_sig
183 ; traceTc (text "tc_grhss" <+> ppr sig_tvs)
184 ; (co_fn, grhss') <- tcExtendTyVarEnv sig_tvs $
185 tcThingWithSig sig_ty (tcGRHSs ctxt grhss . Check) rhs_ty
187 -- Push the coercion down to the right hand sides,
188 -- because there is no convenient place to hang it otherwise.
189 ; if isIdCoercion co_fn then
192 return (lift_grhss co_fn grhss') }
195 lift_grhss co_fn (GRHSs grhss binds)
196 = GRHSs (map (fmap lift_grhs) grhss) binds
198 lift_grhs (GRHS stmts) = GRHS (map lift_stmt stmts)
200 lift_stmt (L loc (ResultStmt e)) = L loc (ResultStmt (fmap (co_fn <$>) e))
201 lift_stmt stmt = stmt
204 tcGRHSs :: TcMatchCtxt -> GRHSs Name
205 -> Expected TcRhoType
208 -- Special case when there is just one equation with a degenerate
209 -- guard; then we pass in the full Expected type, so that we get
210 -- good inference from simple things like
211 -- f = \(x::forall a.a->a) -> <stuff>
212 -- This is a consequence of the fact that tcStmts takes a TcType,
213 -- not a Expected TcType, a decision we could revisit if necessary
214 tcGRHSs ctxt (GRHSs [L loc1 (GRHS [L loc2 (ResultStmt rhs)])] binds) exp_ty
215 = tcBindsAndThen glueBindsOnGRHSs binds $
216 mc_body ctxt rhs exp_ty `thenM` \ rhs' ->
217 returnM (GRHSs [L loc1 (GRHS [L loc2 (ResultStmt rhs')])] [])
219 tcGRHSs ctxt (GRHSs grhss binds) exp_ty
220 = tcBindsAndThen glueBindsOnGRHSs binds $
221 zapExpectedType exp_ty openTypeKind `thenM` \ exp_ty' ->
222 -- Even if there is only one guard, we zap the RHS type to
223 -- a monotype. Reason: it makes tcStmts much easier,
224 -- and even a one-armed guard has a notional second arm
226 stmt_ctxt = SC { sc_what = PatGuard (mc_what ctxt),
230 sc_body body = mc_body ctxt body (Check exp_ty')
232 tc_grhs (GRHS guarded)
233 = tcStmts stmt_ctxt guarded `thenM` \ guarded' ->
234 returnM (GRHS guarded')
236 mappM (wrapLocM tc_grhs) grhss `thenM` \ grhss' ->
237 returnM (GRHSs grhss' [])
242 tcThingWithSig :: TcSigmaType -- Type signature
243 -> (TcRhoType -> TcM r) -- How to type check the thing inside
244 -> Expected TcRhoType -- Overall expected result type
246 -- Used for expressions with a type signature, and for result type signatures
248 tcThingWithSig sig_ty thing_inside res_ty
249 | not (isSigmaTy sig_ty)
250 = thing_inside sig_ty `thenM` \ result ->
251 tcSubExp res_ty sig_ty `thenM` \ co_fn ->
252 returnM (co_fn, result)
254 | otherwise -- The signature has some outer foralls
255 = -- Must instantiate the outer for-alls of sig_tc_ty
256 -- else we risk instantiating a ? res_ty to a forall-type
257 -- which breaks the invariant that tcMonoExpr only returns phi-types
258 tcGen sig_ty emptyVarSet thing_inside `thenM` \ (gen_fn, result) ->
259 tcInstCall InstSigOrigin sig_ty `thenM` \ (inst_fn, _, inst_sig_ty) ->
260 tcSubExp res_ty inst_sig_ty `thenM` \ co_fn ->
261 returnM (co_fn <.> inst_fn <.> gen_fn, result)
262 -- Note that we generalise, then instantiate. Ah well.
266 %************************************************************************
268 \subsection{tcMatchPats}
270 %************************************************************************
273 tcMatchPats :: [LPat Name]
274 -> [Expected TcSigmaType] -- Pattern types
275 -> Expected TcRhoType -- Result type;
276 -- used only to check existential escape
278 -> TcM ([LPat TcId], a)
279 -- Typecheck the patterns, extend the environment to bind the variables,
280 -- do the thing inside, use any existentially-bound dictionaries to
281 -- discharge parts of the returning LIE, and deal with pattern type
284 tcMatchPats pats tys body_ty thing_inside
285 = do { (pats', ex_tvs, res) <- tcPats LamPat pats tys thing_inside
286 ; tcCheckExistentialPat pats' ex_tvs tys body_ty
287 ; returnM (pats', res) }
289 tcCheckExistentialPat :: [LPat TcId] -- Patterns (just for error message)
290 -> [TcTyVar] -- Existentially quantified tyvars bound by pattern
291 -> [Expected TcSigmaType] -- Types of the patterns
292 -> Expected TcRhoType -- Type of the body of the match
293 -- Tyvars in either of these must not escape
295 -- NB: we *must* pass "pats_tys" not just "body_ty" to tcCheckExistentialPat
296 -- For example, we must reject this program:
297 -- data C = forall a. C (a -> Int)
299 -- Here, result_ty will be simply Int, but expected_ty is (C -> a -> Int).
301 tcCheckExistentialPat pats [] pat_tys body_ty
302 = return () -- Short cut for case when there are no existentials
304 tcCheckExistentialPat pats ex_tvs pat_tys body_ty
305 = do { tys <- mapM readExpectedType (body_ty : pat_tys)
306 ; addErrCtxtM (sigPatCtxt (collectPatsBinders pats) ex_tvs tys) $
307 checkSigTyVarsWrt (tyVarsOfTypes tys) ex_tvs }
311 %************************************************************************
313 \subsection{@tcDoStmts@ typechecks a {\em list} of do statements}
315 %************************************************************************
318 tcDoStmts :: HsStmtContext Name
319 -> [LStmt Name] -> ReboundNames Name
320 -> TcRhoType -- To keep it simple, we don't have an "expected" type here
321 -> TcM ([LStmt TcId], ReboundNames TcId)
322 tcDoStmts PArrComp stmts method_names res_ty
323 = do { [elt_ty] <- unifyTyConApp parrTyCon res_ty
324 ; stmts' <- tcComprehension PArrComp parrTyCon elt_ty stmts
325 ; return (stmts', [{- unused -}]) }
327 tcDoStmts ListComp stmts method_names res_ty
328 = unifyListTy res_ty ` thenM` \ elt_ty ->
329 tcComprehension ListComp listTyCon elt_ty stmts `thenM` \ stmts' ->
330 returnM (stmts', [{- unused -}])
332 tcDoStmts do_or_mdo stmts method_names res_ty
333 = newTyFlexiVarTy (mkArrowKind liftedTypeKind liftedTypeKind) `thenM` \ m_ty ->
334 newTyFlexiVarTy liftedTypeKind `thenM` \ elt_ty ->
335 unifyTauTy res_ty (mkAppTy m_ty elt_ty) `thenM_`
337 ctxt = SC { sc_what = do_or_mdo,
338 sc_rhs = \ rhs -> do { (rhs', rhs_ty) <- tcInferRho rhs
339 ; rhs_elt_ty <- unifyAppTy m_ty rhs_ty
340 ; return (rhs', rhs_elt_ty) },
341 sc_body = \ body -> tcCheckRho body res_ty,
344 tcStmts ctxt stmts `thenM` \ stmts' ->
346 -- Build the then and zero methods in case we need them
347 -- It's important that "then" and "return" appear just once in the final LIE,
348 -- not only for typechecker efficiency, but also because otherwise during
349 -- simplification we end up with silly stuff like
350 -- then = case d of (t,r) -> t
352 -- where the second "then" sees that it already exists in the "available" stuff.
353 mapM (tcSyntaxName DoOrigin m_ty) method_names `thenM` \ methods ->
355 returnM (stmts', methods)
357 tcComprehension do_or_lc m_tycon elt_ty stmts
360 ctxt = SC { sc_what = do_or_lc,
361 sc_rhs = \ rhs -> do { (rhs', rhs_ty) <- tcInferRho rhs
362 ; [rhs_elt_ty] <- unifyTyConApp m_tycon rhs_ty
363 ; return (rhs', rhs_elt_ty) },
364 sc_body = \ body -> tcCheckRho body elt_ty, -- Note: no m_tycon here!
365 sc_ty = mkTyConApp m_tycon [elt_ty] }
369 %************************************************************************
373 %************************************************************************
375 Typechecking statements is rendered a bit tricky by parallel list comprehensions:
377 [ (g x, h x) | ... ; let g v = ...
378 | ... ; let h v = ... ]
380 It's possible that g,h are overloaded, so we need to feed the LIE from the
381 (g x, h x) up through both lots of bindings (so we get the bindInstsOfLocalFuns).
382 Similarly if we had an existential pattern match:
384 data T = forall a. Show a => C a
386 [ (show x, show y) | ... ; C x <- ...
389 Then we need the LIE from (show x, show y) to be simplified against
390 the bindings for x and y.
392 It's difficult to do this in parallel, so we rely on the renamer to
393 ensure that g,h and x,y don't duplicate, and simply grow the environment.
394 So the binders of the first parallel group will be in scope in the second
395 group. But that's fine; there's no shadowing to worry about.
399 = ASSERT( notNull stmts )
400 tcStmtsAndThen (:) ctxt stmts (returnM [])
403 = SC { sc_what :: HsStmtContext Name, -- What kind of thing this is
404 sc_rhs :: LHsExpr Name -> TcM (LHsExpr TcId, TcType), -- Type inference for RHS computations
405 sc_body :: LHsExpr Name -> TcM (LHsExpr TcId), -- Type checker for return computation
406 sc_ty :: TcType } -- Return type; used *only* to check
407 -- for escape in existential patterns
408 -- We use type *inference* for the RHS computations, becuase of GADTs.
409 -- do { pat <- rhs; <rest> }
411 -- case rhs of { pat -> <rest> }
412 -- We do inference on rhs, so that information about its type can be refined
413 -- when type-checking the pattern.
416 :: (LStmt TcId -> thing -> thing) -- Combiner
423 tcStmtsAndThen combine ctxt [] thing_inside
426 tcStmtsAndThen combine ctxt (stmt:stmts) thing_inside
427 = tcStmtAndThen combine ctxt stmt $
428 tcStmtsAndThen combine ctxt stmts $
432 tcStmtAndThen combine ctxt (L _ (LetStmt binds)) thing_inside
433 = tcBindsAndThen -- No error context, but a binding group is
434 (glue_binds combine) -- rather a large thing for an error context anyway
439 tcStmtAndThen combine ctxt (L src_loc stmt@(BindStmt pat exp)) thing_inside
440 = setSrcSpan src_loc $
441 addErrCtxt (stmtCtxt ctxt stmt) $
442 do { (exp', pat_ty) <- sc_rhs ctxt exp
443 ; ([pat'], thing) <- tcMatchPats [pat] [Check pat_ty] (Check (sc_ty ctxt)) $
444 popErrCtxt thing_inside
445 ; return (combine (L src_loc (BindStmt pat' exp')) thing) }
448 tcStmtAndThen combine ctxt (L src_loc stmt@(ExprStmt exp _)) thing_inside
449 = setSrcSpan src_loc (
450 addErrCtxt (stmtCtxt ctxt stmt) $
451 if isDoExpr (sc_what ctxt)
452 then -- do or mdo; the expression is a computation
453 sc_rhs ctxt exp `thenM` \ (exp', exp_ty) ->
454 returnM (L src_loc (ExprStmt exp' exp_ty))
455 else -- List comprehensions, pattern guards; expression is a boolean
456 tcCheckRho exp boolTy `thenM` \ exp' ->
457 returnM (L src_loc (ExprStmt exp' boolTy))
460 thing_inside `thenM` \ thing ->
461 returnM (combine stmt' thing)
465 tcStmtAndThen combine ctxt (L src_loc (ParStmt bndr_stmts_s)) thing_inside
466 = loop bndr_stmts_s `thenM` \ (pairs', thing) ->
467 returnM (combine (L src_loc (ParStmt pairs')) thing)
469 loop [] = thing_inside `thenM` \ thing ->
472 loop ((stmts, bndrs) : pairs)
473 = tcStmtsAndThen combine_par ctxt stmts $
474 -- Notice we pass on ctxt; the result type is used only
475 -- to get escaping type variables for checkExistentialPat
476 tcLookupLocalIds bndrs `thenM` \ bndrs' ->
477 loop pairs `thenM` \ (pairs', thing) ->
478 returnM (([], bndrs') : pairs', thing)
480 combine_par stmt ((stmts, bndrs) : pairs , thing) = ((stmt:stmts, bndrs) : pairs, thing)
483 tcStmtAndThen combine ctxt (L src_loc (RecStmt stmts laterNames recNames _)) thing_inside
484 = newTyFlexiVarTys (length recNames) liftedTypeKind `thenM` \ recTys ->
486 rec_ids = zipWith mkLocalId recNames recTys
488 tcExtendIdEnv rec_ids $
489 tcStmtsAndThen combine_rec ctxt stmts (
490 zipWithM tc_ret recNames recTys `thenM` \ rec_rets ->
491 tcLookupLocalIds laterNames `thenM` \ later_ids ->
492 returnM ([], (later_ids, rec_rets))
493 ) `thenM` \ (stmts', (later_ids, rec_rets)) ->
495 tcExtendIdEnv later_ids $
496 -- NB: The rec_ids for the recursive things
497 -- already scope over this part. This binding may shadow
498 -- some of them with polymorphic things with the same Name
499 -- (see note [RecStmt] in HsExpr)
500 getLIE thing_inside `thenM` \ (thing, lie) ->
501 bindInstsOfLocalFuns lie later_ids `thenM` \ lie_binds ->
503 returnM (combine (L src_loc (RecStmt stmts' later_ids rec_ids rec_rets)) $
504 combine (L src_loc (LetStmt [HsBindGroup lie_binds [] Recursive])) $
507 combine_rec stmt (stmts, thing) = (stmt:stmts, thing)
509 -- Unify the types of the "final" Ids with those of "knot-tied" Ids
510 tc_ret rec_name mono_ty
511 = tcLookupId rec_name `thenM` \ poly_id ->
512 -- poly_id may have a polymorphic type
513 -- but mono_ty is just a monomorphic type variable
514 tcSubExp (Check mono_ty) (idType poly_id) `thenM` \ co_fn ->
515 returnM (L src_loc (co_fn <$> HsVar poly_id))
518 tcStmtAndThen combine ctxt (L src_loc stmt@(ResultStmt exp)) thing_inside
519 = addErrCtxt (stmtCtxt ctxt stmt) (sc_body ctxt exp) `thenM` \ exp' ->
520 thing_inside `thenM` \ thing ->
521 returnM (combine (L src_loc (ResultStmt exp')) thing)
524 ------------------------------
525 glue_binds combine binds thing = combine (noLoc (LetStmt [binds])) thing
526 -- ToDo: fix the noLoc
530 %************************************************************************
532 \subsection{Errors and contexts}
534 %************************************************************************
536 @sameNoOfArgs@ takes a @[RenamedMatch]@ and decides whether the same
537 number of args are used in each equation.
540 sameNoOfArgs :: MatchGroup Name -> Bool
541 sameNoOfArgs (MatchGroup matches _)
542 = isSingleton (nub (map args_in_match matches))
544 args_in_match :: LMatch Name -> Int
545 args_in_match (L _ (Match pats _ _)) = length pats
549 varyingArgsErr name matches
550 = sep [ptext SLIT("Varying number of arguments for function"), quotes (ppr name)]
552 matchCtxt ctxt match = hang (ptext SLIT("In") <+> pprMatchContext ctxt <> colon)
553 4 (pprMatch ctxt match)
555 stmtCtxt ctxt stmt = hang (ptext SLIT("In") <+> pp_ctxt (sc_what ctxt) <> colon) 4 (ppr stmt)
557 pp_ctxt = case stmt of
558 ResultStmt _ -> pprStmtResultContext
559 other -> pprStmtContext
561 sigPatCtxt bound_ids bound_tvs tys tidy_env
562 = -- tys is (body_ty : pat_tys)
563 mapM zonkTcType tys `thenM` \ tys' ->
565 (env1, tidy_tys) = tidyOpenTypes tidy_env (map idType show_ids)
566 (_env2, tidy_body_ty : tidy_pat_tys) = tidyOpenTypes env1 tys'
569 sep [ptext SLIT("When checking an existential match that binds"),
570 nest 4 (vcat (zipWith ppr_id show_ids tidy_tys)),
571 ptext SLIT("The pattern(s) have type(s):") <+> vcat (map ppr tidy_pat_tys),
572 ptext SLIT("The body has type:") <+> ppr tidy_body_ty
575 show_ids = filter is_interesting bound_ids
576 is_interesting id = any (`elemVarSet` idFreeTyVars id) bound_tvs
578 ppr_id id ty = ppr id <+> dcolon <+> ppr ty
579 -- Don't zonk the types so we get the separate, un-unified versions