2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
6 TcMatches: Typecheck some @Matches@
10 -- The above warning supression flag is a temporary kludge.
11 -- While working on this module you are encouraged to remove it and fix
12 -- any warnings in the module. See
13 -- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
16 module TcMatches ( tcMatchesFun, tcGRHSsPat, tcMatchesCase, tcMatchLambda,
17 matchCtxt, TcMatchCtxt(..),
18 tcStmts, tcDoStmts, tcBody,
19 tcDoStmt, tcMDoStmt, tcGuardStmt
22 #include "HsVersions.h"
24 import {-# SOURCE #-} TcExpr( tcSyntaxOp, tcInferRho, tcMonoExpr, tcPolyExpr )
46 %************************************************************************
48 \subsection{tcMatchesFun, tcMatchesCase}
50 %************************************************************************
52 @tcMatchesFun@ typechecks a @[Match]@ list which occurs in a
53 @FunMonoBind@. The second argument is the name of the function, which
54 is used in error messages. It checks that all the equations have the
55 same number of arguments before using @tcMatches@ to do the work.
58 tcMatchesFun :: Name -> Bool
60 -> BoxyRhoType -- Expected type of function
61 -> TcM (HsWrapper, MatchGroup TcId) -- Returns type of body
63 tcMatchesFun fun_name inf matches exp_ty
64 = do { -- Check that they all have the same no of arguments
65 -- Location is in the monad, set the caller so that
66 -- any inter-equation error messages get some vaguely
67 -- sensible location. Note: we have to do this odd
68 -- ann-grabbing, because we don't always have annotations in
69 -- hand when we call tcMatchesFun...
70 checkArgs fun_name matches
72 -- ToDo: Don't use "expected" stuff if there ain't a type signature
73 -- because inconsistency between branches
74 -- may show up as something wrong with the (non-existent) type signature
76 -- This is one of two places places we call subFunTys
77 -- The point is that if expected_y is a "hole", we want
78 -- to make pat_tys and rhs_ty as "holes" too.
79 ; subFunTys doc n_pats exp_ty $ \ pat_tys rhs_ty ->
80 tcMatches match_ctxt pat_tys rhs_ty matches
83 doc = ptext SLIT("The equation(s) for") <+> quotes (ppr fun_name)
84 <+> ptext SLIT("have") <+> speakNOf n_pats (ptext SLIT("argument"))
85 n_pats = matchGroupArity matches
86 match_ctxt = MC { mc_what = FunRhs fun_name inf, mc_body = tcBody }
89 @tcMatchesCase@ doesn't do the argument-count check because the
90 parser guarantees that each equation has exactly one argument.
93 tcMatchesCase :: TcMatchCtxt -- Case context
94 -> TcRhoType -- Type of scrutinee
95 -> MatchGroup Name -- The case alternatives
96 -> BoxyRhoType -- Type of whole case expressions
97 -> TcM (MatchGroup TcId) -- Translated alternatives
99 tcMatchesCase ctxt scrut_ty matches res_ty
100 = tcMatches ctxt [scrut_ty] res_ty matches
102 tcMatchLambda :: MatchGroup Name -> BoxyRhoType -> TcM (HsWrapper, MatchGroup TcId)
103 tcMatchLambda match res_ty
104 = subFunTys doc n_pats res_ty $ \ pat_tys rhs_ty ->
105 tcMatches match_ctxt pat_tys rhs_ty match
107 n_pats = matchGroupArity match
108 doc = sep [ ptext SLIT("The lambda expression")
109 <+> quotes (pprSetDepth 1 $ pprMatches LambdaExpr match),
110 -- The pprSetDepth makes the abstraction print briefly
111 ptext SLIT("has") <+> speakNOf n_pats (ptext SLIT("argument"))]
112 match_ctxt = MC { mc_what = LambdaExpr,
116 @tcGRHSsPat@ typechecks @[GRHSs]@ that occur in a @PatMonoBind@.
119 tcGRHSsPat :: GRHSs Name -> BoxyRhoType -> TcM (GRHSs TcId)
120 -- Used for pattern bindings
121 tcGRHSsPat grhss res_ty = tcGRHSs match_ctxt grhss (emptyRefinement, res_ty)
122 -- emptyRefinement: no refinement in a pattern binding
124 match_ctxt = MC { mc_what = PatBindRhs,
129 %************************************************************************
133 %************************************************************************
136 tcMatches :: TcMatchCtxt
137 -> [BoxySigmaType] -- Expected pattern types
138 -> BoxyRhoType -- Expected result-type of the Match.
140 -> TcM (MatchGroup TcId)
142 data TcMatchCtxt -- c.f. TcStmtCtxt, also in this module
143 = MC { mc_what :: HsMatchContext Name, -- What kind of thing this is
144 mc_body :: LHsExpr Name -- Type checker for a body of an alternative
145 -> (Refinement, BoxyRhoType)
146 -> TcM (LHsExpr TcId) }
148 tcMatches ctxt pat_tys rhs_ty (MatchGroup matches _)
149 = do { matches' <- mapM (tcMatch ctxt pat_tys rhs_ty) matches
150 ; return (MatchGroup matches' (mkFunTys pat_tys rhs_ty)) }
153 tcMatch :: TcMatchCtxt
154 -> [BoxySigmaType] -- Expected pattern types
155 -> BoxyRhoType -- Expected result-type of the Match.
159 tcMatch ctxt pat_tys rhs_ty match
160 = wrapLocM (tc_match ctxt pat_tys rhs_ty) match
162 tc_match ctxt pat_tys rhs_ty match@(Match pats maybe_rhs_sig grhss)
163 = add_match_ctxt match $
164 do { (pats', grhss') <- tcLamPats pats pat_tys rhs_ty $
165 tc_grhss ctxt maybe_rhs_sig grhss
166 ; return (Match pats' Nothing grhss') }
168 tc_grhss ctxt Nothing grhss rhs_ty
169 = tcGRHSs ctxt grhss rhs_ty -- No result signature
171 -- Result type sigs are no longer supported
172 tc_grhss ctxt (Just res_sig) grhss (co, rhs_ty)
173 = do { addErr (ptext SLIT("Ignoring (deprecated) result type signature")
175 ; tcGRHSs ctxt grhss (co, rhs_ty) }
177 -- For (\x -> e), tcExpr has already said "In the expresssion \x->e"
178 -- so we don't want to add "In the lambda abstraction \x->e"
179 add_match_ctxt match thing_inside
180 = case mc_what ctxt of
181 LambdaExpr -> thing_inside
182 m_ctxt -> addErrCtxt (matchCtxt m_ctxt match) thing_inside
185 tcGRHSs :: TcMatchCtxt -> GRHSs Name -> (Refinement, BoxyRhoType)
188 -- Notice that we pass in the full res_ty, so that we get
189 -- good inference from simple things like
190 -- f = \(x::forall a.a->a) -> <stuff>
191 -- We used to force it to be a monotype when there was more than one guard
192 -- but we don't need to do that any more
194 tcGRHSs ctxt (GRHSs grhss binds) res_ty
195 = do { (binds', grhss') <- tcLocalBinds binds $
196 mappM (wrapLocM (tcGRHS ctxt res_ty)) grhss
198 ; returnM (GRHSs grhss' binds') }
201 tcGRHS :: TcMatchCtxt -> (Refinement, BoxyRhoType) -> GRHS Name -> TcM (GRHS TcId)
203 tcGRHS ctxt res_ty (GRHS guards rhs)
204 = do { (guards', rhs') <- tcStmts stmt_ctxt tcGuardStmt guards res_ty $
206 ; return (GRHS guards' rhs') }
208 stmt_ctxt = PatGuard (mc_what ctxt)
212 %************************************************************************
214 \subsection{@tcDoStmts@ typechecks a {\em list} of do statements}
216 %************************************************************************
219 tcDoStmts :: HsStmtContext Name
223 -> TcM (HsExpr TcId) -- Returns a HsDo
224 tcDoStmts ListComp stmts body res_ty
225 = do { elt_ty <- boxySplitListTy res_ty
226 ; (stmts', body') <- tcStmts ListComp (tcLcStmt listTyCon) stmts
227 (emptyRefinement,elt_ty) $
229 ; return (HsDo ListComp stmts' body' (mkListTy elt_ty)) }
231 tcDoStmts PArrComp stmts body res_ty
232 = do { [elt_ty] <- boxySplitTyConApp parrTyCon res_ty
233 ; (stmts', body') <- tcStmts PArrComp (tcLcStmt parrTyCon) stmts
234 (emptyRefinement, elt_ty) $
236 ; return (HsDo PArrComp stmts' body' (mkPArrTy elt_ty)) }
238 tcDoStmts DoExpr stmts body res_ty
239 = do { (m_ty, elt_ty) <- boxySplitAppTy res_ty
240 ; let res_ty' = mkAppTy m_ty elt_ty -- The boxySplit consumes res_ty
241 ; (stmts', body') <- tcStmts DoExpr (tcDoStmt m_ty) stmts
242 (emptyRefinement, res_ty') $
244 ; return (HsDo DoExpr stmts' body' res_ty') }
246 tcDoStmts ctxt@(MDoExpr _) stmts body res_ty
247 = do { (m_ty, elt_ty) <- boxySplitAppTy res_ty
248 ; let res_ty' = mkAppTy m_ty elt_ty -- The boxySplit consumes res_ty
249 tc_rhs rhs = withBox liftedTypeKind $ \ pat_ty ->
250 tcMonoExpr rhs (mkAppTy m_ty pat_ty)
252 ; (stmts', body') <- tcStmts ctxt (tcMDoStmt tc_rhs) stmts
253 (emptyRefinement, res_ty') $
256 ; let names = [mfixName, bindMName, thenMName, returnMName, failMName]
257 ; insts <- mapM (newMethodFromName DoOrigin m_ty) names
258 ; return (HsDo (MDoExpr (names `zip` insts)) stmts' body' res_ty') }
260 tcDoStmts ctxt stmts body res_ty = pprPanic "tcDoStmts" (pprStmtContext ctxt)
262 tcBody :: LHsExpr Name -> (Refinement, BoxyRhoType) -> TcM (LHsExpr TcId)
263 tcBody body (reft, res_ty)
264 = do { traceTc (text "tcBody" <+> ppr res_ty <+> ppr reft)
265 ; let (co, res_ty') = refineResType reft res_ty
266 ; body' <- tcPolyExpr body res_ty'
267 ; return (mkLHsWrap co body') }
271 %************************************************************************
275 %************************************************************************
279 = forall thing. HsStmtContext Name
281 -> (Refinement, BoxyRhoType) -- Result type for comprehension
282 -> ((Refinement,BoxyRhoType) -> TcM thing) -- Checker for what follows the stmt
283 -> TcM (Stmt TcId, thing)
285 -- The incoming BoxyRhoType may be refined by type refinements
286 -- before being passed to the thing_inside
288 tcStmts :: HsStmtContext Name
289 -> TcStmtChecker -- NB: higher-rank type
291 -> (Refinement, BoxyRhoType)
292 -> ((Refinement, BoxyRhoType) -> TcM thing)
293 -> TcM ([LStmt TcId], thing)
295 -- Note the higher-rank type. stmt_chk is applied at different
296 -- types in the equations for tcStmts
298 tcStmts ctxt stmt_chk [] res_ty thing_inside
299 = do { thing <- thing_inside res_ty
300 ; return ([], thing) }
302 -- LetStmts are handled uniformly, regardless of context
303 tcStmts ctxt stmt_chk (L loc (LetStmt binds) : stmts) res_ty thing_inside
304 = do { (binds', (stmts',thing)) <- tcLocalBinds binds $
305 tcStmts ctxt stmt_chk stmts res_ty thing_inside
306 ; return (L loc (LetStmt binds') : stmts', thing) }
308 -- For the vanilla case, handle the location-setting part
309 tcStmts ctxt stmt_chk (L loc stmt : stmts) res_ty thing_inside
310 = do { (stmt', (stmts', thing)) <-
312 addErrCtxt (stmtCtxt ctxt stmt) $
313 stmt_chk ctxt stmt res_ty $ \ res_ty' ->
315 tcStmts ctxt stmt_chk stmts res_ty' $
317 ; return (L loc stmt' : stmts', thing) }
319 --------------------------------
321 tcGuardStmt :: TcStmtChecker
322 tcGuardStmt ctxt (ExprStmt guard _ _) res_ty thing_inside
323 = do { guard' <- tcMonoExpr guard boolTy
324 ; thing <- thing_inside res_ty
325 ; return (ExprStmt guard' noSyntaxExpr boolTy, thing) }
327 tcGuardStmt ctxt (BindStmt pat rhs _ _) res_ty thing_inside
328 = do { (rhs', rhs_ty) <- tcInferRho rhs
329 ; (pat', thing) <- tcLamPat pat rhs_ty res_ty thing_inside
330 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
332 tcGuardStmt ctxt stmt res_ty thing_inside
333 = pprPanic "tcGuardStmt: unexpected Stmt" (ppr stmt)
336 --------------------------------
337 -- List comprehensions and PArrays
339 tcLcStmt :: TyCon -- The list/Parray type constructor ([] or PArray)
342 -- A generator, pat <- rhs
343 tcLcStmt m_tc ctxt (BindStmt pat rhs _ _) res_ty thing_inside
344 = do { (rhs', pat_ty) <- withBox liftedTypeKind $ \ ty ->
345 tcMonoExpr rhs (mkTyConApp m_tc [ty])
346 ; (pat', thing) <- tcLamPat pat pat_ty res_ty thing_inside
347 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
350 tcLcStmt m_tc ctxt (ExprStmt rhs _ _) res_ty thing_inside
351 = do { rhs' <- tcMonoExpr rhs boolTy
352 ; thing <- thing_inside res_ty
353 ; return (ExprStmt rhs' noSyntaxExpr boolTy, thing) }
355 -- A parallel set of comprehensions
356 -- [ (g x, h x) | ... ; let g v = ...
357 -- | ... ; let h v = ... ]
359 -- It's possible that g,h are overloaded, so we need to feed the LIE from the
360 -- (g x, h x) up through both lots of bindings (so we get the bindInstsOfLocalFuns).
361 -- Similarly if we had an existential pattern match:
363 -- data T = forall a. Show a => C a
365 -- [ (show x, show y) | ... ; C x <- ...
366 -- | ... ; C y <- ... ]
368 -- Then we need the LIE from (show x, show y) to be simplified against
369 -- the bindings for x and y.
371 -- It's difficult to do this in parallel, so we rely on the renamer to
372 -- ensure that g,h and x,y don't duplicate, and simply grow the environment.
373 -- So the binders of the first parallel group will be in scope in the second
374 -- group. But that's fine; there's no shadowing to worry about.
376 tcLcStmt m_tc ctxt (ParStmt bndr_stmts_s) elt_ty thing_inside
377 = do { (pairs', thing) <- loop bndr_stmts_s
378 ; return (ParStmt pairs', thing) }
380 -- loop :: [([LStmt Name], [Name])] -> TcM ([([LStmt TcId], [TcId])], thing)
381 loop [] = do { thing <- thing_inside elt_ty -- No refinement from pattern
382 ; return ([], thing) } -- matching in the branches
384 loop ((stmts, names) : pairs)
385 = do { (stmts', (ids, pairs', thing))
386 <- tcStmts ctxt (tcLcStmt m_tc) stmts elt_ty $ \ elt_ty' ->
387 do { ids <- tcLookupLocalIds names
388 ; (pairs', thing) <- loop pairs
389 ; return (ids, pairs', thing) }
390 ; return ( (stmts', ids) : pairs', thing ) }
392 tcLcStmt m_tc ctxt stmt elt_ty thing_inside
393 = pprPanic "tcLcStmt: unexpected Stmt" (ppr stmt)
395 --------------------------------
397 -- The main excitement here is dealing with rebindable syntax
399 tcDoStmt :: TcType -- Monad type, m
402 tcDoStmt m_ty ctxt (BindStmt pat rhs bind_op fail_op) reft_res_ty@(_,res_ty) thing_inside
403 = do { (rhs', pat_ty) <- withBox liftedTypeKind $ \ pat_ty ->
404 tcMonoExpr rhs (mkAppTy m_ty pat_ty)
405 -- We should use type *inference* for the RHS computations, becuase of GADTs.
406 -- do { pat <- rhs; <rest> }
408 -- case rhs of { pat -> <rest> }
409 -- We do inference on rhs, so that information about its type can be refined
410 -- when type-checking the pattern.
412 ; (pat', thing) <- tcLamPat pat pat_ty reft_res_ty thing_inside
414 -- Deal with rebindable syntax; (>>=) :: m a -> (a -> m b) -> m b
415 ; let bind_ty = mkFunTys [mkAppTy m_ty pat_ty,
416 mkFunTy pat_ty res_ty] res_ty
417 ; bind_op' <- tcSyntaxOp DoOrigin bind_op bind_ty
418 -- If (but only if) the pattern can fail,
419 -- typecheck the 'fail' operator
420 ; fail_op' <- if isIrrefutableHsPat pat'
421 then return noSyntaxExpr
422 else tcSyntaxOp DoOrigin fail_op (mkFunTy stringTy res_ty)
423 ; return (BindStmt pat' rhs' bind_op' fail_op', thing) }
426 tcDoStmt m_ty ctxt (ExprStmt rhs then_op _) reft_res_ty@(_,res_ty) thing_inside
427 = do { -- Deal with rebindable syntax; (>>) :: m a -> m b -> m b
428 a_ty <- newFlexiTyVarTy liftedTypeKind
429 ; let rhs_ty = mkAppTy m_ty a_ty
430 then_ty = mkFunTys [rhs_ty, res_ty] res_ty
431 ; then_op' <- tcSyntaxOp DoOrigin then_op then_ty
432 ; rhs' <- tcPolyExpr rhs rhs_ty
433 ; thing <- thing_inside reft_res_ty
434 ; return (ExprStmt rhs' then_op' rhs_ty, thing) }
436 tcDoStmt m_ty ctxt stmt res_ty thing_inside
437 = pprPanic "tcDoStmt: unexpected Stmt" (ppr stmt)
439 --------------------------------
441 -- The distinctive features here are
443 -- (b) no rebindable syntax
445 tcMDoStmt :: (LHsExpr Name -> TcM (LHsExpr TcId, TcType)) -- RHS inference
447 tcMDoStmt tc_rhs ctxt (BindStmt pat rhs bind_op fail_op) res_ty thing_inside
448 = do { (rhs', pat_ty) <- tc_rhs rhs
449 ; (pat', thing) <- tcLamPat pat pat_ty res_ty thing_inside
450 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
452 tcMDoStmt tc_rhs ctxt (ExprStmt rhs then_op _) res_ty thing_inside
453 = do { (rhs', elt_ty) <- tc_rhs rhs
454 ; thing <- thing_inside res_ty
455 ; return (ExprStmt rhs' noSyntaxExpr elt_ty, thing) }
457 tcMDoStmt tc_rhs ctxt (RecStmt stmts laterNames recNames _ _) res_ty thing_inside
458 = do { rec_tys <- newFlexiTyVarTys (length recNames) liftedTypeKind
459 ; let rec_ids = zipWith mkLocalId recNames rec_tys
460 ; tcExtendIdEnv rec_ids $ do
461 { (stmts', (later_ids, rec_rets))
462 <- tcStmts ctxt (tcMDoStmt tc_rhs) stmts res_ty $ \ res_ty' ->
463 -- ToDo: res_ty not really right
464 do { rec_rets <- zipWithM tc_ret recNames rec_tys
465 ; later_ids <- tcLookupLocalIds laterNames
466 ; return (later_ids, rec_rets) }
468 ; (thing,lie) <- tcExtendIdEnv later_ids (getLIE (thing_inside res_ty))
469 -- NB: The rec_ids for the recursive things
470 -- already scope over this part. This binding may shadow
471 -- some of them with polymorphic things with the same Name
472 -- (see note [RecStmt] in HsExpr)
473 ; lie_binds <- bindInstsOfLocalFuns lie later_ids
475 ; return (RecStmt stmts' later_ids rec_ids rec_rets lie_binds, thing)
478 -- Unify the types of the "final" Ids with those of "knot-tied" Ids
479 tc_ret rec_name mono_ty
480 = do { poly_id <- tcLookupId rec_name
481 -- poly_id may have a polymorphic type
482 -- but mono_ty is just a monomorphic type variable
483 ; co_fn <- tcSubExp (idType poly_id) mono_ty
484 ; return (mkHsWrap co_fn (HsVar poly_id)) }
486 tcMDoStmt tc_rhs ctxt stmt res_ty thing_inside
487 = pprPanic "tcMDoStmt: unexpected Stmt" (ppr stmt)
492 %************************************************************************
494 \subsection{Errors and contexts}
496 %************************************************************************
498 @sameNoOfArgs@ takes a @[RenamedMatch]@ and decides whether the same
499 number of args are used in each equation.
502 checkArgs :: Name -> MatchGroup Name -> TcM ()
503 checkArgs fun (MatchGroup (match1:matches) _)
504 | null bad_matches = return ()
506 = failWithTc (vcat [ptext SLIT("Equations for") <+> quotes (ppr fun) <+>
507 ptext SLIT("have different numbers of arguments"),
508 nest 2 (ppr (getLoc match1)),
509 nest 2 (ppr (getLoc (head bad_matches)))])
511 n_args1 = args_in_match match1
512 bad_matches = [m | m <- matches, args_in_match m /= n_args1]
514 args_in_match :: LMatch Name -> Int
515 args_in_match (L _ (Match pats _ _)) = length pats
516 checkArgs fun other = panic "TcPat.checkArgs" -- Matches always non-empty
520 matchCtxt ctxt match = hang (ptext SLIT("In") <+> pprMatchContext ctxt <> colon)
521 4 (pprMatch ctxt match)
523 stmtCtxt ctxt stmt = hang (ptext SLIT("In") <+> pprStmtContext ctxt <> colon)