2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
6 TcMatches: Typecheck some @Matches@
9 module TcMatches ( tcMatchesFun, tcGRHSsPat, tcMatchesCase, tcMatchLambda,
10 matchCtxt, TcMatchCtxt(..),
11 tcStmts, tcDoStmts, tcBody,
12 tcDoStmt, tcMDoStmt, tcGuardStmt
15 #include "HsVersions.h"
17 import {-# SOURCE #-} TcExpr( tcSyntaxOp, tcInferRho, tcMonoExpr, tcPolyExpr )
39 %************************************************************************
41 \subsection{tcMatchesFun, tcMatchesCase}
43 %************************************************************************
45 @tcMatchesFun@ typechecks a @[Match]@ list which occurs in a
46 @FunMonoBind@. The second argument is the name of the function, which
47 is used in error messages. It checks that all the equations have the
48 same number of arguments before using @tcMatches@ to do the work.
53 -> BoxyRhoType -- Expected type of function
54 -> TcM (HsWrapper, MatchGroup TcId) -- Returns type of body
56 tcMatchesFun fun_name matches exp_ty
57 = do { -- Check that they all have the same no of arguments
58 -- Location is in the monad, set the caller so that
59 -- any inter-equation error messages get some vaguely
60 -- sensible location. Note: we have to do this odd
61 -- ann-grabbing, because we don't always have annotations in
62 -- hand when we call tcMatchesFun...
63 checkArgs fun_name matches
65 -- ToDo: Don't use "expected" stuff if there ain't a type signature
66 -- because inconsistency between branches
67 -- may show up as something wrong with the (non-existent) type signature
69 -- This is one of two places places we call subFunTys
70 -- The point is that if expected_y is a "hole", we want
71 -- to make pat_tys and rhs_ty as "holes" too.
72 ; subFunTys doc n_pats exp_ty $ \ pat_tys rhs_ty ->
73 tcMatches match_ctxt pat_tys rhs_ty matches
76 doc = ptext SLIT("The equation(s) for") <+> quotes (ppr fun_name)
77 <+> ptext SLIT("have") <+> speakNOf n_pats (ptext SLIT("argument"))
78 n_pats = matchGroupArity matches
79 match_ctxt = MC { mc_what = FunRhs fun_name, mc_body = tcBody }
82 @tcMatchesCase@ doesn't do the argument-count check because the
83 parser guarantees that each equation has exactly one argument.
86 tcMatchesCase :: TcMatchCtxt -- Case context
87 -> TcRhoType -- Type of scrutinee
88 -> MatchGroup Name -- The case alternatives
89 -> BoxyRhoType -- Type of whole case expressions
90 -> TcM (MatchGroup TcId) -- Translated alternatives
92 tcMatchesCase ctxt scrut_ty matches res_ty
93 = tcMatches ctxt [scrut_ty] res_ty matches
95 tcMatchLambda :: MatchGroup Name -> BoxyRhoType -> TcM (HsWrapper, MatchGroup TcId)
96 tcMatchLambda match res_ty
97 = subFunTys doc n_pats res_ty $ \ pat_tys rhs_ty ->
98 tcMatches match_ctxt pat_tys rhs_ty match
100 n_pats = matchGroupArity match
101 doc = sep [ ptext SLIT("The lambda expression")
102 <+> quotes (pprSetDepth 1 $ pprMatches LambdaExpr match),
103 -- The pprSetDepth makes the abstraction print briefly
104 ptext SLIT("has") <+> speakNOf n_pats (ptext SLIT("argument"))]
105 match_ctxt = MC { mc_what = LambdaExpr,
109 @tcGRHSsPat@ typechecks @[GRHSs]@ that occur in a @PatMonoBind@.
112 tcGRHSsPat :: GRHSs Name -> BoxyRhoType -> TcM (GRHSs TcId)
113 -- Used for pattern bindings
114 tcGRHSsPat grhss res_ty = tcGRHSs match_ctxt grhss (emptyRefinement, res_ty)
115 -- emptyRefinement: no refinement in a pattern binding
117 match_ctxt = MC { mc_what = PatBindRhs,
122 %************************************************************************
126 %************************************************************************
129 tcMatches :: TcMatchCtxt
130 -> [BoxySigmaType] -- Expected pattern types
131 -> BoxyRhoType -- Expected result-type of the Match.
133 -> TcM (MatchGroup TcId)
135 data TcMatchCtxt -- c.f. TcStmtCtxt, also in this module
136 = MC { mc_what :: HsMatchContext Name, -- What kind of thing this is
137 mc_body :: LHsExpr Name -- Type checker for a body of an alternative
138 -> (Refinement, BoxyRhoType)
139 -> TcM (LHsExpr TcId) }
141 tcMatches ctxt pat_tys rhs_ty (MatchGroup matches _)
142 = do { matches' <- mapM (tcMatch ctxt pat_tys rhs_ty) matches
143 ; return (MatchGroup matches' (mkFunTys pat_tys rhs_ty)) }
146 tcMatch :: TcMatchCtxt
147 -> [BoxySigmaType] -- Expected pattern types
148 -> BoxyRhoType -- Expected result-type of the Match.
152 tcMatch ctxt pat_tys rhs_ty match
153 = wrapLocM (tc_match ctxt pat_tys rhs_ty) match
155 tc_match ctxt pat_tys rhs_ty match@(Match pats maybe_rhs_sig grhss)
156 = addErrCtxt (matchCtxt (mc_what ctxt) match) $
157 do { (pats', grhss') <- tcLamPats pats pat_tys rhs_ty $
158 tc_grhss ctxt maybe_rhs_sig grhss
159 ; return (Match pats' Nothing grhss') }
161 tc_grhss ctxt Nothing grhss rhs_ty
162 = tcGRHSs ctxt grhss rhs_ty -- No result signature
164 -- Result type sigs are no longer supported
165 tc_grhss ctxt (Just res_sig) grhss (co, rhs_ty)
166 = do { addErr (ptext SLIT("Ignoring (deprecated) result type signature")
168 ; tcGRHSs ctxt grhss (co, rhs_ty) }
171 tcGRHSs :: TcMatchCtxt -> GRHSs Name -> (Refinement, BoxyRhoType)
174 -- Notice that we pass in the full res_ty, so that we get
175 -- good inference from simple things like
176 -- f = \(x::forall a.a->a) -> <stuff>
177 -- We used to force it to be a monotype when there was more than one guard
178 -- but we don't need to do that any more
180 tcGRHSs ctxt (GRHSs grhss binds) res_ty
181 = do { (binds', grhss') <- tcLocalBinds binds $
182 mappM (wrapLocM (tcGRHS ctxt res_ty)) grhss
184 ; returnM (GRHSs grhss' binds') }
187 tcGRHS :: TcMatchCtxt -> (Refinement, BoxyRhoType) -> GRHS Name -> TcM (GRHS TcId)
189 tcGRHS ctxt res_ty (GRHS guards rhs)
190 = do { (guards', rhs') <- tcStmts stmt_ctxt tcGuardStmt guards res_ty $
192 ; return (GRHS guards' rhs') }
194 stmt_ctxt = PatGuard (mc_what ctxt)
198 %************************************************************************
200 \subsection{@tcDoStmts@ typechecks a {\em list} of do statements}
202 %************************************************************************
205 tcDoStmts :: HsStmtContext Name
209 -> TcM (HsExpr TcId) -- Returns a HsDo
210 tcDoStmts ListComp stmts body res_ty
211 = do { elt_ty <- boxySplitListTy res_ty
212 ; (stmts', body') <- tcStmts ListComp (tcLcStmt listTyCon) stmts
213 (emptyRefinement,elt_ty) $
215 ; return (HsDo ListComp stmts' body' (mkListTy elt_ty)) }
217 tcDoStmts PArrComp stmts body res_ty
218 = do { [elt_ty] <- boxySplitTyConApp parrTyCon res_ty
219 ; (stmts', body') <- tcStmts PArrComp (tcLcStmt parrTyCon) stmts
220 (emptyRefinement, elt_ty) $
222 ; return (HsDo PArrComp stmts' body' (mkPArrTy elt_ty)) }
224 tcDoStmts DoExpr stmts body res_ty
225 = do { (m_ty, elt_ty) <- boxySplitAppTy res_ty
226 ; let res_ty' = mkAppTy m_ty elt_ty -- The boxySplit consumes res_ty
227 ; (stmts', body') <- tcStmts DoExpr (tcDoStmt m_ty) stmts
228 (emptyRefinement, res_ty') $
230 ; return (HsDo DoExpr stmts' body' res_ty') }
232 tcDoStmts ctxt@(MDoExpr _) stmts body res_ty
233 = do { (m_ty, elt_ty) <- boxySplitAppTy res_ty
234 ; let res_ty' = mkAppTy m_ty elt_ty -- The boxySplit consumes res_ty
235 tc_rhs rhs = withBox liftedTypeKind $ \ pat_ty ->
236 tcMonoExpr rhs (mkAppTy m_ty pat_ty)
238 ; (stmts', body') <- tcStmts ctxt (tcMDoStmt tc_rhs) stmts
239 (emptyRefinement, res_ty') $
242 ; let names = [mfixName, bindMName, thenMName, returnMName, failMName]
243 ; insts <- mapM (newMethodFromName DoOrigin m_ty) names
244 ; return (HsDo (MDoExpr (names `zip` insts)) stmts' body' res_ty') }
246 tcDoStmts ctxt stmts body res_ty = pprPanic "tcDoStmts" (pprStmtContext ctxt)
248 tcBody :: LHsExpr Name -> (Refinement, BoxyRhoType) -> TcM (LHsExpr TcId)
249 tcBody body (reft, res_ty)
250 = do { traceTc (text "tcBody" <+> ppr res_ty <+> ppr reft)
251 ; let (co, res_ty') = refineResType reft res_ty
252 ; body' <- tcPolyExpr body res_ty'
253 ; return (mkLHsWrap co body') }
257 %************************************************************************
261 %************************************************************************
265 = forall thing. HsStmtContext Name
267 -> (Refinement, BoxyRhoType) -- Result type for comprehension
268 -> ((Refinement,BoxyRhoType) -> TcM thing) -- Checker for what follows the stmt
269 -> TcM (Stmt TcId, thing)
271 -- The incoming BoxyRhoType may be refined by type refinements
272 -- before being passed to the thing_inside
274 tcStmts :: HsStmtContext Name
275 -> TcStmtChecker -- NB: higher-rank type
277 -> (Refinement, BoxyRhoType)
278 -> ((Refinement, BoxyRhoType) -> TcM thing)
279 -> TcM ([LStmt TcId], thing)
281 -- Note the higher-rank type. stmt_chk is applied at different
282 -- types in the equations for tcStmts
284 tcStmts ctxt stmt_chk [] res_ty thing_inside
285 = do { thing <- thing_inside res_ty
286 ; return ([], thing) }
288 -- LetStmts are handled uniformly, regardless of context
289 tcStmts ctxt stmt_chk (L loc (LetStmt binds) : stmts) res_ty thing_inside
290 = do { (binds', (stmts',thing)) <- tcLocalBinds binds $
291 tcStmts ctxt stmt_chk stmts res_ty thing_inside
292 ; return (L loc (LetStmt binds') : stmts', thing) }
294 -- For the vanilla case, handle the location-setting part
295 tcStmts ctxt stmt_chk (L loc stmt : stmts) res_ty thing_inside
296 = do { (stmt', (stmts', thing)) <-
298 addErrCtxt (stmtCtxt ctxt stmt) $
299 stmt_chk ctxt stmt res_ty $ \ res_ty' ->
301 tcStmts ctxt stmt_chk stmts res_ty' $
303 ; return (L loc stmt' : stmts', thing) }
305 --------------------------------
307 tcGuardStmt :: TcStmtChecker
308 tcGuardStmt ctxt (ExprStmt guard _ _) res_ty thing_inside
309 = do { guard' <- tcMonoExpr guard boolTy
310 ; thing <- thing_inside res_ty
311 ; return (ExprStmt guard' noSyntaxExpr boolTy, thing) }
313 tcGuardStmt ctxt (BindStmt pat rhs _ _) res_ty thing_inside
314 = do { (rhs', rhs_ty) <- tcInferRho rhs
315 ; (pat', thing) <- tcLamPat pat rhs_ty res_ty thing_inside
316 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
318 tcGuardStmt ctxt stmt res_ty thing_inside
319 = pprPanic "tcGuardStmt: unexpected Stmt" (ppr stmt)
322 --------------------------------
323 -- List comprehensions and PArrays
325 tcLcStmt :: TyCon -- The list/Parray type constructor ([] or PArray)
328 -- A generator, pat <- rhs
329 tcLcStmt m_tc ctxt (BindStmt pat rhs _ _) res_ty thing_inside
330 = do { (rhs', pat_ty) <- withBox liftedTypeKind $ \ ty ->
331 tcMonoExpr rhs (mkTyConApp m_tc [ty])
332 ; (pat', thing) <- tcLamPat pat pat_ty res_ty thing_inside
333 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
336 tcLcStmt m_tc ctxt (ExprStmt rhs _ _) res_ty thing_inside
337 = do { rhs' <- tcMonoExpr rhs boolTy
338 ; thing <- thing_inside res_ty
339 ; return (ExprStmt rhs' noSyntaxExpr boolTy, thing) }
341 -- A parallel set of comprehensions
342 -- [ (g x, h x) | ... ; let g v = ...
343 -- | ... ; let h v = ... ]
345 -- It's possible that g,h are overloaded, so we need to feed the LIE from the
346 -- (g x, h x) up through both lots of bindings (so we get the bindInstsOfLocalFuns).
347 -- Similarly if we had an existential pattern match:
349 -- data T = forall a. Show a => C a
351 -- [ (show x, show y) | ... ; C x <- ...
352 -- | ... ; C y <- ... ]
354 -- Then we need the LIE from (show x, show y) to be simplified against
355 -- the bindings for x and y.
357 -- It's difficult to do this in parallel, so we rely on the renamer to
358 -- ensure that g,h and x,y don't duplicate, and simply grow the environment.
359 -- So the binders of the first parallel group will be in scope in the second
360 -- group. But that's fine; there's no shadowing to worry about.
362 tcLcStmt m_tc ctxt (ParStmt bndr_stmts_s) elt_ty thing_inside
363 = do { (pairs', thing) <- loop bndr_stmts_s
364 ; return (ParStmt pairs', thing) }
366 -- loop :: [([LStmt Name], [Name])] -> TcM ([([LStmt TcId], [TcId])], thing)
367 loop [] = do { thing <- thing_inside elt_ty -- No refinement from pattern
368 ; return ([], thing) } -- matching in the branches
370 loop ((stmts, names) : pairs)
371 = do { (stmts', (ids, pairs', thing))
372 <- tcStmts ctxt (tcLcStmt m_tc) stmts elt_ty $ \ elt_ty' ->
373 do { ids <- tcLookupLocalIds names
374 ; (pairs', thing) <- loop pairs
375 ; return (ids, pairs', thing) }
376 ; return ( (stmts', ids) : pairs', thing ) }
378 tcLcStmt m_tc ctxt stmt elt_ty thing_inside
379 = pprPanic "tcLcStmt: unexpected Stmt" (ppr stmt)
381 --------------------------------
383 -- The main excitement here is dealing with rebindable syntax
385 tcDoStmt :: TcType -- Monad type, m
388 tcDoStmt m_ty ctxt (BindStmt pat rhs bind_op fail_op) reft_res_ty@(_,res_ty) thing_inside
389 = do { (rhs', pat_ty) <- withBox liftedTypeKind $ \ pat_ty ->
390 tcMonoExpr rhs (mkAppTy m_ty pat_ty)
391 -- We should use type *inference* for the RHS computations, becuase of GADTs.
392 -- do { pat <- rhs; <rest> }
394 -- case rhs of { pat -> <rest> }
395 -- We do inference on rhs, so that information about its type can be refined
396 -- when type-checking the pattern.
398 ; (pat', thing) <- tcLamPat pat pat_ty reft_res_ty thing_inside
400 -- Deal with rebindable syntax; (>>=) :: m a -> (a -> m b) -> m b
401 ; let bind_ty = mkFunTys [mkAppTy m_ty pat_ty,
402 mkFunTy pat_ty res_ty] res_ty
403 ; bind_op' <- tcSyntaxOp DoOrigin bind_op bind_ty
404 -- If (but only if) the pattern can fail,
405 -- typecheck the 'fail' operator
406 ; fail_op' <- if isIrrefutableHsPat pat'
407 then return noSyntaxExpr
408 else tcSyntaxOp DoOrigin fail_op (mkFunTy stringTy res_ty)
409 ; return (BindStmt pat' rhs' bind_op' fail_op', thing) }
412 tcDoStmt m_ty ctxt (ExprStmt rhs then_op _) reft_res_ty@(_,res_ty) thing_inside
413 = do { -- Deal with rebindable syntax; (>>) :: m a -> m b -> m b
414 a_ty <- newFlexiTyVarTy liftedTypeKind
415 ; let rhs_ty = mkAppTy m_ty a_ty
416 then_ty = mkFunTys [rhs_ty, res_ty] res_ty
417 ; then_op' <- tcSyntaxOp DoOrigin then_op then_ty
418 ; rhs' <- tcPolyExpr rhs rhs_ty
419 ; thing <- thing_inside reft_res_ty
420 ; return (ExprStmt rhs' then_op' rhs_ty, thing) }
422 tcDoStmt m_ty ctxt stmt res_ty thing_inside
423 = pprPanic "tcDoStmt: unexpected Stmt" (ppr stmt)
425 --------------------------------
427 -- The distinctive features here are
429 -- (b) no rebindable syntax
431 tcMDoStmt :: (LHsExpr Name -> TcM (LHsExpr TcId, TcType)) -- RHS inference
433 tcMDoStmt tc_rhs ctxt (BindStmt pat rhs bind_op fail_op) res_ty thing_inside
434 = do { (rhs', pat_ty) <- tc_rhs rhs
435 ; (pat', thing) <- tcLamPat pat pat_ty res_ty thing_inside
436 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
438 tcMDoStmt tc_rhs ctxt (ExprStmt rhs then_op _) res_ty thing_inside
439 = do { (rhs', elt_ty) <- tc_rhs rhs
440 ; thing <- thing_inside res_ty
441 ; return (ExprStmt rhs' noSyntaxExpr elt_ty, thing) }
443 tcMDoStmt tc_rhs ctxt (RecStmt stmts laterNames recNames _ _) res_ty thing_inside
444 = do { rec_tys <- newFlexiTyVarTys (length recNames) liftedTypeKind
445 ; let rec_ids = zipWith mkLocalId recNames rec_tys
446 ; tcExtendIdEnv rec_ids $ do
447 { (stmts', (later_ids, rec_rets))
448 <- tcStmts ctxt (tcMDoStmt tc_rhs) stmts res_ty $ \ res_ty' ->
449 -- ToDo: res_ty not really right
450 do { rec_rets <- zipWithM tc_ret recNames rec_tys
451 ; later_ids <- tcLookupLocalIds laterNames
452 ; return (later_ids, rec_rets) }
454 ; (thing,lie) <- tcExtendIdEnv later_ids (getLIE (thing_inside res_ty))
455 -- NB: The rec_ids for the recursive things
456 -- already scope over this part. This binding may shadow
457 -- some of them with polymorphic things with the same Name
458 -- (see note [RecStmt] in HsExpr)
459 ; lie_binds <- bindInstsOfLocalFuns lie later_ids
461 ; return (RecStmt stmts' later_ids rec_ids rec_rets lie_binds, thing)
464 -- Unify the types of the "final" Ids with those of "knot-tied" Ids
465 tc_ret rec_name mono_ty
466 = do { poly_id <- tcLookupId rec_name
467 -- poly_id may have a polymorphic type
468 -- but mono_ty is just a monomorphic type variable
469 ; co_fn <- tcSubExp (idType poly_id) mono_ty
470 ; return (mkHsWrap co_fn (HsVar poly_id)) }
472 tcMDoStmt tc_rhs ctxt stmt res_ty thing_inside
473 = pprPanic "tcMDoStmt: unexpected Stmt" (ppr stmt)
478 %************************************************************************
480 \subsection{Errors and contexts}
482 %************************************************************************
484 @sameNoOfArgs@ takes a @[RenamedMatch]@ and decides whether the same
485 number of args are used in each equation.
488 checkArgs :: Name -> MatchGroup Name -> TcM ()
489 checkArgs fun (MatchGroup (match1:matches) _)
490 | null bad_matches = return ()
492 = failWithTc (vcat [ptext SLIT("Equations for") <+> quotes (ppr fun) <+>
493 ptext SLIT("have different numbers of arguments"),
494 nest 2 (ppr (getLoc match1)),
495 nest 2 (ppr (getLoc (head bad_matches)))])
497 n_args1 = args_in_match match1
498 bad_matches = [m | m <- matches, args_in_match m /= n_args1]
500 args_in_match :: LMatch Name -> Int
501 args_in_match (L _ (Match pats _ _)) = length pats
502 checkArgs fun other = panic "TcPat.checkArgs" -- Matches always non-empty
506 matchCtxt ctxt match = hang (ptext SLIT("In") <+> pprMatchContext ctxt <> colon)
507 4 (pprMatch ctxt match)
509 stmtCtxt ctxt stmt = hang (ptext SLIT("In") <+> pprStmtContext ctxt <> colon)