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,
11 tcStmts, tcDoStmts, tcBody,
12 tcDoStmt, tcMDoStmt, tcGuardStmt
15 import {-# SOURCE #-} TcExpr( tcSyntaxOp, tcInferRhoNC,
16 tcMonoExpr, tcMonoExprNC, tcPolyExpr )
41 #include "HsVersions.h"
44 %************************************************************************
46 \subsection{tcMatchesFun, tcMatchesCase}
48 %************************************************************************
50 @tcMatchesFun@ typechecks a @[Match]@ list which occurs in a
51 @FunMonoBind@. The second argument is the name of the function, which
52 is used in error messages. It checks that all the equations have the
53 same number of arguments before using @tcMatches@ to do the work.
56 tcMatchesFun :: Name -> Bool
58 -> BoxyRhoType -- Expected type of function
59 -> TcM (HsWrapper, MatchGroup TcId) -- Returns type of body
61 tcMatchesFun fun_name inf matches exp_ty
62 = do { -- Check that they all have the same no of arguments
63 -- Location is in the monad, set the caller so that
64 -- any inter-equation error messages get some vaguely
65 -- sensible location. Note: we have to do this odd
66 -- ann-grabbing, because we don't always have annotations in
67 -- hand when we call tcMatchesFun...
68 checkArgs fun_name matches
70 -- ToDo: Don't use "expected" stuff if there ain't a type signature
71 -- because inconsistency between branches
72 -- may show up as something wrong with the (non-existent) type signature
74 -- This is one of two places places we call subFunTys
75 -- The point is that if expected_y is a "hole", we want
76 -- to make pat_tys and rhs_ty as "holes" too.
77 ; subFunTys doc n_pats exp_ty (Just (FunSigCtxt fun_name)) $ \ pat_tys rhs_ty ->
78 tcMatches match_ctxt pat_tys rhs_ty matches
81 doc = ptext (sLit "The equation(s) for") <+> quotes (ppr fun_name)
82 <+> ptext (sLit "have") <+> speakNOf n_pats (ptext (sLit "argument"))
83 n_pats = matchGroupArity matches
84 match_ctxt = MC { mc_what = FunRhs fun_name inf, mc_body = tcBody }
87 @tcMatchesCase@ doesn't do the argument-count check because the
88 parser guarantees that each equation has exactly one argument.
91 tcMatchesCase :: TcMatchCtxt -- Case context
92 -> TcRhoType -- Type of scrutinee
93 -> MatchGroup Name -- The case alternatives
94 -> BoxyRhoType -- Type of whole case expressions
95 -> TcM (MatchGroup TcId) -- Translated alternatives
97 tcMatchesCase ctxt scrut_ty matches res_ty
98 | isEmptyMatchGroup matches
99 = -- Allow empty case expressions
100 do { -- Make sure we follow the invariant that res_ty is filled in
101 res_ty' <- refineBoxToTau res_ty
102 ; return (MatchGroup [] (mkFunTys [scrut_ty] res_ty')) }
105 = tcMatches ctxt [scrut_ty] res_ty matches
107 tcMatchLambda :: MatchGroup Name -> BoxyRhoType -> TcM (HsWrapper, MatchGroup TcId)
108 tcMatchLambda match res_ty
109 = subFunTys doc n_pats res_ty Nothing $ \ pat_tys rhs_ty ->
110 tcMatches match_ctxt pat_tys rhs_ty match
112 n_pats = matchGroupArity match
113 doc = sep [ ptext (sLit "The lambda expression")
114 <+> quotes (pprSetDepth (PartWay 1) $
115 pprMatches (LambdaExpr :: HsMatchContext Name) match),
116 -- The pprSetDepth makes the abstraction print briefly
117 ptext (sLit "has") <+> speakNOf n_pats (ptext (sLit "argument"))]
118 match_ctxt = MC { mc_what = LambdaExpr,
122 @tcGRHSsPat@ typechecks @[GRHSs]@ that occur in a @PatMonoBind@.
125 tcGRHSsPat :: GRHSs Name -> BoxyRhoType -> TcM (GRHSs TcId)
126 -- Used for pattern bindings
127 tcGRHSsPat grhss res_ty = tcGRHSs match_ctxt grhss res_ty
129 match_ctxt = MC { mc_what = PatBindRhs,
134 %************************************************************************
138 %************************************************************************
141 tcMatches :: TcMatchCtxt
142 -> [BoxySigmaType] -- Expected pattern types
143 -> BoxyRhoType -- Expected result-type of the Match.
145 -> TcM (MatchGroup TcId)
147 data TcMatchCtxt -- c.f. TcStmtCtxt, also in this module
148 = MC { mc_what :: HsMatchContext Name, -- What kind of thing this is
149 mc_body :: LHsExpr Name -- Type checker for a body of
152 -> TcM (LHsExpr TcId) }
154 tcMatches ctxt pat_tys rhs_ty (MatchGroup matches _)
155 = ASSERT( not (null matches) ) -- Ensure that rhs_ty is filled in
156 do { matches' <- mapM (tcMatch ctxt pat_tys rhs_ty) matches
157 ; return (MatchGroup matches' (mkFunTys pat_tys rhs_ty)) }
160 tcMatch :: TcMatchCtxt
161 -> [BoxySigmaType] -- Expected pattern types
162 -> BoxyRhoType -- Expected result-type of the Match.
166 tcMatch ctxt pat_tys rhs_ty match
167 = wrapLocM (tc_match ctxt pat_tys rhs_ty) match
169 tc_match ctxt pat_tys rhs_ty match@(Match pats maybe_rhs_sig grhss)
170 = add_match_ctxt match $
171 do { (pats', grhss') <- tcPats (mc_what ctxt) pats pat_tys rhs_ty $
172 tc_grhss ctxt maybe_rhs_sig grhss
173 ; return (Match pats' Nothing grhss') }
175 tc_grhss ctxt Nothing grhss rhs_ty
176 = tcGRHSs ctxt grhss rhs_ty -- No result signature
178 -- Result type sigs are no longer supported
179 tc_grhss _ (Just {}) _ _
180 = panic "tc_ghrss" -- Rejected by renamer
182 -- For (\x -> e), tcExpr has already said "In the expresssion \x->e"
183 -- so we don't want to add "In the lambda abstraction \x->e"
184 add_match_ctxt match thing_inside
185 = case mc_what ctxt of
186 LambdaExpr -> thing_inside
187 m_ctxt -> addErrCtxt (pprMatchInCtxt m_ctxt match) thing_inside
190 tcGRHSs :: TcMatchCtxt -> GRHSs Name -> BoxyRhoType
193 -- Notice that we pass in the full res_ty, so that we get
194 -- good inference from simple things like
195 -- f = \(x::forall a.a->a) -> <stuff>
196 -- We used to force it to be a monotype when there was more than one guard
197 -- but we don't need to do that any more
199 tcGRHSs ctxt (GRHSs grhss binds) res_ty
200 = do { (binds', grhss') <- tcLocalBinds binds $
201 mapM (wrapLocM (tcGRHS ctxt res_ty)) grhss
203 ; return (GRHSs grhss' binds') }
206 tcGRHS :: TcMatchCtxt -> BoxyRhoType -> GRHS Name -> TcM (GRHS TcId)
208 tcGRHS ctxt res_ty (GRHS guards rhs)
209 = do { (guards', rhs') <- tcStmts stmt_ctxt tcGuardStmt guards res_ty $
211 ; return (GRHS guards' rhs') }
213 stmt_ctxt = PatGuard (mc_what ctxt)
217 %************************************************************************
219 \subsection{@tcDoStmts@ typechecks a {\em list} of do statements}
221 %************************************************************************
224 tcDoStmts :: HsStmtContext Name
228 -> TcM (HsExpr TcId) -- Returns a HsDo
229 tcDoStmts ListComp stmts body res_ty
230 = do { (elt_ty, coi) <- boxySplitListTy res_ty
231 ; (stmts', body') <- tcStmts ListComp (tcLcStmt listTyCon) stmts
234 ; return $ mkHsWrapCoI coi
235 (HsDo ListComp stmts' body' (mkListTy elt_ty)) }
237 tcDoStmts PArrComp stmts body res_ty
238 = do { (elt_ty, coi) <- boxySplitPArrTy res_ty
239 ; (stmts', body') <- tcStmts PArrComp (tcLcStmt parrTyCon) stmts
242 ; return $ mkHsWrapCoI coi
243 (HsDo PArrComp stmts' body' (mkPArrTy elt_ty)) }
245 tcDoStmts DoExpr stmts body res_ty
246 = do { (stmts', body') <- tcStmts DoExpr tcDoStmt stmts res_ty $
248 ; return (HsDo DoExpr stmts' body' res_ty) }
250 tcDoStmts ctxt@(MDoExpr _) stmts body res_ty
251 = do { ((m_ty, elt_ty), coi) <- boxySplitAppTy res_ty
252 ; let res_ty' = mkAppTy m_ty elt_ty -- The boxySplit consumes res_ty
253 tc_rhs rhs = withBox liftedTypeKind $ \ pat_ty ->
254 tcMonoExpr rhs (mkAppTy m_ty pat_ty)
256 ; (stmts', body') <- tcStmts ctxt (tcMDoStmt tc_rhs) stmts
260 ; let names = [mfixName, bindMName, thenMName, returnMName, failMName]
261 ; insts <- mapM (newMethodFromName DoOrigin m_ty) names
264 (HsDo (MDoExpr (names `zip` insts)) stmts' body' res_ty') }
266 tcDoStmts ctxt _ _ _ = pprPanic "tcDoStmts" (pprStmtContext ctxt)
268 tcBody :: LHsExpr Name -> BoxyRhoType -> TcM (LHsExpr TcId)
270 = do { traceTc (text "tcBody" <+> ppr res_ty)
271 ; body' <- tcMonoExpr body res_ty
277 %************************************************************************
281 %************************************************************************
285 = forall thing. HsStmtContext Name
287 -> BoxyRhoType -- Result type for comprehension
288 -> (BoxyRhoType -> TcM thing) -- Checker for what follows the stmt
289 -> TcM (Stmt TcId, thing)
291 tcStmts :: HsStmtContext Name
292 -> TcStmtChecker -- NB: higher-rank type
295 -> (BoxyRhoType -> TcM thing)
296 -> TcM ([LStmt TcId], thing)
298 -- Note the higher-rank type. stmt_chk is applied at different
299 -- types in the equations for tcStmts
301 tcStmts _ _ [] res_ty thing_inside
302 = do { thing <- thing_inside res_ty
303 ; return ([], thing) }
305 -- LetStmts are handled uniformly, regardless of context
306 tcStmts ctxt stmt_chk (L loc (LetStmt binds) : stmts) res_ty thing_inside
307 = do { (binds', (stmts',thing)) <- tcLocalBinds binds $
308 tcStmts ctxt stmt_chk stmts res_ty thing_inside
309 ; return (L loc (LetStmt binds') : stmts', thing) }
311 -- For the vanilla case, handle the location-setting part
312 tcStmts ctxt stmt_chk (L loc stmt : stmts) res_ty thing_inside
313 = do { (stmt', (stmts', thing)) <-
315 addErrCtxt (pprStmtInCtxt ctxt stmt) $
316 stmt_chk ctxt stmt res_ty $ \ res_ty' ->
318 tcStmts ctxt stmt_chk stmts res_ty' $
320 ; return (L loc stmt' : stmts', thing) }
322 --------------------------------
324 tcGuardStmt :: TcStmtChecker
325 tcGuardStmt _ (ExprStmt guard _ _) res_ty thing_inside
326 = do { guard' <- tcMonoExpr guard boolTy
327 ; thing <- thing_inside res_ty
328 ; return (ExprStmt guard' noSyntaxExpr boolTy, thing) }
330 tcGuardStmt ctxt (BindStmt pat rhs _ _) res_ty thing_inside
331 = do { (rhs', rhs_ty) <- tcInferRhoNC rhs -- Stmt has a context already
332 ; (pat', thing) <- tcPat (StmtCtxt ctxt) pat rhs_ty res_ty thing_inside
333 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
335 tcGuardStmt _ stmt _ _
336 = pprPanic "tcGuardStmt: unexpected Stmt" (ppr stmt)
339 --------------------------------
340 -- List comprehensions and PArrays
342 tcLcStmt :: TyCon -- The list/Parray type constructor ([] or PArray)
345 -- A generator, pat <- rhs
346 tcLcStmt m_tc ctxt (BindStmt pat rhs _ _) res_ty thing_inside
347 = do { (rhs', pat_ty) <- withBox liftedTypeKind $ \ ty ->
348 tcMonoExpr rhs (mkTyConApp m_tc [ty])
349 ; (pat', thing) <- tcPat (StmtCtxt ctxt) pat pat_ty res_ty thing_inside
350 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
353 tcLcStmt _ _ (ExprStmt rhs _ _) res_ty thing_inside
354 = do { rhs' <- tcMonoExpr rhs boolTy
355 ; thing <- thing_inside res_ty
356 ; return (ExprStmt rhs' noSyntaxExpr boolTy, thing) }
358 -- A parallel set of comprehensions
359 -- [ (g x, h x) | ... ; let g v = ...
360 -- | ... ; let h v = ... ]
362 -- It's possible that g,h are overloaded, so we need to feed the LIE from the
363 -- (g x, h x) up through both lots of bindings (so we get the bindInstsOfLocalFuns).
364 -- Similarly if we had an existential pattern match:
366 -- data T = forall a. Show a => C a
368 -- [ (show x, show y) | ... ; C x <- ...
369 -- | ... ; C y <- ... ]
371 -- Then we need the LIE from (show x, show y) to be simplified against
372 -- the bindings for x and y.
374 -- It's difficult to do this in parallel, so we rely on the renamer to
375 -- ensure that g,h and x,y don't duplicate, and simply grow the environment.
376 -- So the binders of the first parallel group will be in scope in the second
377 -- group. But that's fine; there's no shadowing to worry about.
379 tcLcStmt m_tc ctxt (ParStmt bndr_stmts_s) elt_ty thing_inside
380 = do { (pairs', thing) <- loop bndr_stmts_s
381 ; return (ParStmt pairs', thing) }
383 -- loop :: [([LStmt Name], [Name])] -> TcM ([([LStmt TcId], [TcId])], thing)
384 loop [] = do { thing <- thing_inside elt_ty
385 ; return ([], thing) } -- matching in the branches
387 loop ((stmts, names) : pairs)
388 = do { (stmts', (ids, pairs', thing))
389 <- tcStmts ctxt (tcLcStmt m_tc) stmts elt_ty $ \ _elt_ty' ->
390 do { ids <- tcLookupLocalIds names
391 ; (pairs', thing) <- loop pairs
392 ; return (ids, pairs', thing) }
393 ; return ( (stmts', ids) : pairs', thing ) }
395 tcLcStmt m_tc ctxt (TransformStmt (stmts, binders) usingExpr maybeByExpr) elt_ty thing_inside = do
396 (stmts', (binders', usingExpr', maybeByExpr', thing)) <-
397 tcStmts (TransformStmtCtxt ctxt) (tcLcStmt m_tc) stmts elt_ty $ \elt_ty' -> do
398 let alphaListTy = mkTyConApp m_tc [alphaTy]
400 (usingExpr', maybeByExpr') <-
403 -- We must validate that usingExpr :: forall a. [a] -> [a]
404 usingExpr' <- tcPolyExpr usingExpr (mkForAllTy alphaTyVar (alphaListTy `mkFunTy` alphaListTy))
405 return (usingExpr', Nothing)
407 -- We must infer a type such that e :: t and then check that usingExpr :: forall a. (a -> t) -> [a] -> [a]
408 (byExpr', tTy) <- tcInferRhoNC byExpr
409 usingExpr' <- tcPolyExpr usingExpr (mkForAllTy alphaTyVar ((alphaTy `mkFunTy` tTy) `mkFunTy` (alphaListTy `mkFunTy` alphaListTy)))
410 return (usingExpr', Just byExpr')
412 binders' <- tcLookupLocalIds binders
413 thing <- thing_inside elt_ty'
415 return (binders', usingExpr', maybeByExpr', thing)
417 return (TransformStmt (stmts', binders') usingExpr' maybeByExpr', thing)
419 tcLcStmt m_tc ctxt (GroupStmt (stmts, bindersMap) groupByClause) elt_ty thing_inside = do
420 (stmts', (bindersMap', groupByClause', thing)) <-
421 tcStmts (TransformStmtCtxt ctxt) (tcLcStmt m_tc) stmts elt_ty $ \elt_ty' -> do
422 let alphaListTy = mkTyConApp m_tc [alphaTy]
423 alphaListListTy = mkTyConApp m_tc [alphaListTy]
426 case groupByClause of
427 GroupByNothing usingExpr ->
428 -- We must validate that usingExpr :: forall a. [a] -> [[a]]
429 tcPolyExpr usingExpr (mkForAllTy alphaTyVar (alphaListTy `mkFunTy` alphaListListTy)) >>= (return . GroupByNothing)
430 GroupBySomething eitherUsingExpr byExpr -> do
431 -- We must infer a type such that byExpr :: t
432 (byExpr', tTy) <- tcInferRhoNC byExpr
434 -- If it exists, we then check that usingExpr :: forall a. (a -> t) -> [a] -> [[a]]
435 let expectedUsingType = mkForAllTy alphaTyVar ((alphaTy `mkFunTy` tTy) `mkFunTy` (alphaListTy `mkFunTy` alphaListListTy))
437 case eitherUsingExpr of
438 Left usingExpr -> (tcPolyExpr usingExpr expectedUsingType) >>= (return . Left)
439 Right usingExpr -> (tcPolyExpr (noLoc usingExpr) expectedUsingType) >>= (return . Right . unLoc)
440 return $ GroupBySomething eitherUsingExpr' byExpr'
442 -- Find the IDs and types of all old binders
443 let (oldBinders, newBinders) = unzip bindersMap
444 oldBinders' <- tcLookupLocalIds oldBinders
446 -- Ensure that every old binder of type b is linked up with its new binder which should have type [b]
447 let newBinders' = zipWith associateNewBinder oldBinders' newBinders
449 -- Type check the thing in the environment with these new binders and return the result
450 thing <- tcExtendIdEnv newBinders' (thing_inside elt_ty')
451 return (zipEqual "tcLcStmt: Old and new binder lists were not of the same length" oldBinders' newBinders', groupByClause', thing)
453 return (GroupStmt (stmts', bindersMap') groupByClause', thing)
455 associateNewBinder :: TcId -> Name -> TcId
456 associateNewBinder oldBinder newBinder = mkLocalId newBinder (mkTyConApp m_tc [idType oldBinder])
458 tcLcStmt _ _ stmt _ _
459 = pprPanic "tcLcStmt: unexpected Stmt" (ppr stmt)
461 --------------------------------
463 -- The main excitement here is dealing with rebindable syntax
465 tcDoStmt :: TcStmtChecker
467 tcDoStmt ctxt (BindStmt pat rhs bind_op fail_op) res_ty thing_inside
468 = do { -- Deal with rebindable syntax:
469 -- (>>=) :: rhs_ty -> (pat_ty -> new_res_ty) -> res_ty
470 -- This level of generality is needed for using do-notation
471 -- in full generality; see Trac #1537
473 -- I'd like to put this *after* the tcSyntaxOp
474 -- (see Note [Treat rebindable syntax first], but that breaks
475 -- the rigidity info for GADTs. When we move to the new story
476 -- for GADTs, we can move this after tcSyntaxOp
477 (rhs', rhs_ty) <- tcInferRhoNC rhs
479 ; ((bind_op', new_res_ty), pat_ty) <-
480 withBox liftedTypeKind $ \ pat_ty ->
481 withBox liftedTypeKind $ \ new_res_ty ->
482 tcSyntaxOp DoOrigin bind_op
483 (mkFunTys [rhs_ty, mkFunTy pat_ty new_res_ty] res_ty)
485 -- If (but only if) the pattern can fail,
486 -- typecheck the 'fail' operator
487 ; fail_op' <- if isIrrefutableHsPat pat
488 then return noSyntaxExpr
489 else tcSyntaxOp DoOrigin fail_op (mkFunTy stringTy new_res_ty)
491 -- We should typecheck the RHS *before* the pattern,
493 -- do { pat <- rhs; <rest> }
495 -- case rhs of { pat -> <rest> }
496 -- We do inference on rhs, so that information about its type
497 -- can be refined when type-checking the pattern.
499 ; (pat', thing) <- tcPat (StmtCtxt ctxt) pat pat_ty new_res_ty thing_inside
501 ; return (BindStmt pat' rhs' bind_op' fail_op', thing) }
504 tcDoStmt _ (ExprStmt rhs then_op _) res_ty thing_inside
505 = do { -- Deal with rebindable syntax;
506 -- (>>) :: rhs_ty -> new_res_ty -> res_ty
507 -- See also Note [Treat rebindable syntax first]
508 ((then_op', rhs_ty), new_res_ty) <-
509 withBox liftedTypeKind $ \ new_res_ty ->
510 withBox liftedTypeKind $ \ rhs_ty ->
511 tcSyntaxOp DoOrigin then_op
512 (mkFunTys [rhs_ty, new_res_ty] res_ty)
514 ; rhs' <- tcMonoExprNC rhs rhs_ty
515 ; thing <- thing_inside new_res_ty
516 ; return (ExprStmt rhs' then_op' rhs_ty, thing) }
518 tcDoStmt ctxt (RecStmt { recS_stmts = stmts, recS_later_ids = later_names
519 , recS_rec_ids = rec_names, recS_ret_fn = ret_op
520 , recS_mfix_fn = mfix_op, recS_bind_fn = bind_op })
522 = do { let tup_names = rec_names ++ filterOut (`elem` rec_names) later_names
523 ; tup_elt_tys <- newFlexiTyVarTys (length tup_names) liftedTypeKind
524 ; let tup_ids = zipWith mkLocalId tup_names tup_elt_tys
525 tup_ty = mkBoxedTupleTy tup_elt_tys
527 ; tcExtendIdEnv tup_ids $ do
528 { ((stmts', (ret_op', tup_rets)), stmts_ty)
529 <- withBox liftedTypeKind $ \ stmts_ty ->
530 tcStmts ctxt tcDoStmt stmts stmts_ty $ \ inner_res_ty ->
531 do { tup_rets <- zipWithM tc_ret tup_names tup_elt_tys
532 ; ret_op' <- tcSyntaxOp DoOrigin ret_op (mkFunTy tup_ty inner_res_ty)
533 ; return (ret_op', tup_rets) }
535 ; (mfix_op', mfix_res_ty) <- withBox liftedTypeKind $ \ mfix_res_ty ->
536 tcSyntaxOp DoOrigin mfix_op
537 (mkFunTy (mkFunTy tup_ty stmts_ty) mfix_res_ty)
539 ; (bind_op', new_res_ty) <- withBox liftedTypeKind $ \ new_res_ty ->
540 tcSyntaxOp DoOrigin bind_op
541 (mkFunTys [mfix_res_ty, mkFunTy tup_ty new_res_ty] res_ty)
543 ; (thing,lie) <- getLIE (thing_inside new_res_ty)
544 ; lie_binds <- bindInstsOfLocalFuns lie tup_ids
546 ; let rec_ids = takeList rec_names tup_ids
547 ; later_ids <- tcLookupLocalIds later_names
548 ; traceTc (text "tcdo" <+> vcat [ppr rec_ids <+> ppr (map idType rec_ids),
549 ppr later_ids <+> ppr (map idType later_ids)])
550 ; return (RecStmt { recS_stmts = stmts', recS_later_ids = later_ids
551 , recS_rec_ids = rec_ids, recS_ret_fn = ret_op'
552 , recS_mfix_fn = mfix_op', recS_bind_fn = bind_op'
553 , recS_rec_rets = tup_rets, recS_dicts = lie_binds }, thing)
556 -- Unify the types of the "final" Ids with those of "knot-tied" Ids
557 tc_ret rec_name mono_ty
558 = do { poly_id <- tcLookupId rec_name
559 -- poly_id may have a polymorphic type
560 -- but mono_ty is just a monomorphic type variable
561 ; co_fn <- tcSubExp DoOrigin (idType poly_id) mono_ty
562 ; return (mkHsWrap co_fn (HsVar poly_id)) }
565 = pprPanic "tcDoStmt: unexpected Stmt" (ppr stmt)
568 Note [Treat rebindable syntax first]
569 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
571 do { bar; ... } :: IO ()
572 we want to typecheck 'bar' in the knowledge that it should be an IO thing,
573 pushing info from the context into the RHS. To do this, we check the
574 rebindable syntax first, and push that information into (tcMonoExprNC rhs).
575 Otherwise the error shows up when cheking the rebindable syntax, and
576 the expected/inferred stuff is back to front (see Trac #3613).
579 --------------------------------
581 -- The distinctive features here are
583 -- (b) no rebindable syntax
585 tcMDoStmt :: (LHsExpr Name -> TcM (LHsExpr TcId, TcType)) -- RHS inference
587 tcMDoStmt tc_rhs ctxt (BindStmt pat rhs _ _) res_ty thing_inside
588 = do { (rhs', pat_ty) <- tc_rhs rhs
589 ; (pat', thing) <- tcPat (StmtCtxt ctxt) pat pat_ty res_ty thing_inside
590 ; return (BindStmt pat' rhs' noSyntaxExpr noSyntaxExpr, thing) }
592 tcMDoStmt tc_rhs _ (ExprStmt rhs _ _) res_ty thing_inside
593 = do { (rhs', elt_ty) <- tc_rhs rhs
594 ; thing <- thing_inside res_ty
595 ; return (ExprStmt rhs' noSyntaxExpr elt_ty, thing) }
597 tcMDoStmt tc_rhs ctxt (RecStmt stmts laterNames recNames _ _ _ _ _) res_ty thing_inside
598 = do { rec_tys <- newFlexiTyVarTys (length recNames) liftedTypeKind
599 ; let rec_ids = zipWith mkLocalId recNames rec_tys
600 ; tcExtendIdEnv rec_ids $ do
601 { (stmts', (later_ids, rec_rets))
602 <- tcStmts ctxt (tcMDoStmt tc_rhs) stmts res_ty $ \ _res_ty' ->
603 -- ToDo: res_ty not really right
604 do { rec_rets <- zipWithM tc_ret recNames rec_tys
605 ; later_ids <- tcLookupLocalIds laterNames
606 ; return (later_ids, rec_rets) }
608 ; (thing,lie) <- tcExtendIdEnv later_ids (getLIE (thing_inside res_ty))
609 -- NB: The rec_ids for the recursive things
610 -- already scope over this part. This binding may shadow
611 -- some of them with polymorphic things with the same Name
612 -- (see note [RecStmt] in HsExpr)
613 ; lie_binds <- bindInstsOfLocalFuns lie later_ids
615 ; return (RecStmt stmts' later_ids rec_ids noSyntaxExpr noSyntaxExpr noSyntaxExpr rec_rets lie_binds, thing)
618 -- Unify the types of the "final" Ids with those of "knot-tied" Ids
619 tc_ret rec_name mono_ty
620 = do { poly_id <- tcLookupId rec_name
621 -- poly_id may have a polymorphic type
622 -- but mono_ty is just a monomorphic type variable
623 ; co_fn <- tcSubExp DoOrigin (idType poly_id) mono_ty
624 ; return (mkHsWrap co_fn (HsVar poly_id)) }
626 tcMDoStmt _ _ stmt _ _
627 = pprPanic "tcMDoStmt: unexpected Stmt" (ppr stmt)
632 %************************************************************************
634 \subsection{Errors and contexts}
636 %************************************************************************
638 @sameNoOfArgs@ takes a @[RenamedMatch]@ and decides whether the same
639 number of args are used in each equation.
642 checkArgs :: Name -> MatchGroup Name -> TcM ()
643 checkArgs fun (MatchGroup (match1:matches) _)
644 | null bad_matches = return ()
646 = failWithTc (vcat [ptext (sLit "Equations for") <+> quotes (ppr fun) <+>
647 ptext (sLit "have different numbers of arguments"),
648 nest 2 (ppr (getLoc match1)),
649 nest 2 (ppr (getLoc (head bad_matches)))])
651 n_args1 = args_in_match match1
652 bad_matches = [m | m <- matches, args_in_match m /= n_args1]
654 args_in_match :: LMatch Name -> Int
655 args_in_match (L _ (Match pats _ _)) = length pats
656 checkArgs _ _ = panic "TcPat.checkArgs" -- Matches always non-empty