X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcArrows.lhs;h=11daed77dae22f7c89997e2afd6adaaa832b75ae;hp=c575808a97ff019905fc3c63e805cbbd026f0455;hb=30c122df62ec75f9ed7f392f24c2925675bf1d06;hpb=7fc749a43b4b6b85d234fa95d4928648259584f4 diff --git a/compiler/typecheck/TcArrows.lhs b/compiler/typecheck/TcArrows.lhs index c575808..11daed7 100644 --- a/compiler/typecheck/TcArrows.lhs +++ b/compiler/typecheck/TcArrows.lhs @@ -27,10 +27,10 @@ import TcType import TcMType import TcBinds import TcSimplify -import TcGadt import TcPat import TcUnify import TcRnMonad +import Coercion import Inst import Name import TysWiredIn @@ -40,7 +40,10 @@ import Type import SrcLoc import Outputable +import FastString import Util + +import Control.Monad \end{code} %************************************************************************ @@ -52,16 +55,18 @@ import Util \begin{code} tcProc :: InPat Name -> LHsCmdTop Name -- proc pat -> expr -> BoxyRhoType -- Expected type of whole proc expression - -> TcM (OutPat TcId, LHsCmdTop TcId) + -> TcM (OutPat TcId, LHsCmdTop TcId, CoercionI) tcProc pat cmd exp_ty = newArrowScope $ - do { (exp_ty1, res_ty) <- boxySplitAppTy exp_ty - ; (arr_ty, arg_ty) <- boxySplitAppTy exp_ty1 + do { ((exp_ty1, res_ty), coi) <- boxySplitAppTy exp_ty + ; ((arr_ty, arg_ty), coi1) <- boxySplitAppTy exp_ty1 ; let cmd_env = CmdEnv { cmd_arr = arr_ty } - ; (pat', cmd') <- tcLamPat pat arg_ty (emptyRefinement, res_ty) $ + ; (pat', cmd') <- tcProcPat pat arg_ty res_ty $ tcCmdTop cmd_env cmd [] - ; return (pat', cmd') } + ; let res_coi = mkTransCoI coi (mkAppTyCoI exp_ty1 coi1 res_ty IdCo) + ; return (pat', cmd', res_coi) + } \end{code} @@ -85,27 +90,27 @@ mkCmdArrTy env t1 t2 = mkAppTys (cmd_arr env) [t1, t2] tcCmdTop :: CmdEnv -> LHsCmdTop Name -> CmdStack - -> (Refinement, TcTauType) -- Expected result type; always a monotype - -- We know exactly how many cmd args are expected, - -- albeit perhaps not their types; so we can pass - -- in a CmdStack + -> TcTauType -- Expected result type; always a monotype + -- We know exactly how many cmd args are expected, + -- albeit perhaps not their types; so we can pass + -- in a CmdStack -> TcM (LHsCmdTop TcId) -tcCmdTop env (L loc (HsCmdTop cmd _ _ names)) cmd_stk reft_res_ty@(_,res_ty) +tcCmdTop env (L loc (HsCmdTop cmd _ _ names)) cmd_stk res_ty = setSrcSpan loc $ - do { cmd' <- tcGuardedCmd env cmd cmd_stk reft_res_ty + do { cmd' <- tcGuardedCmd env cmd cmd_stk res_ty ; names' <- mapM (tcSyntaxName ProcOrigin (cmd_arr env)) names ; return (L loc $ HsCmdTop cmd' cmd_stk res_ty names') } ---------------------------------------- tcGuardedCmd :: CmdEnv -> LHsExpr Name -> CmdStack - -> (Refinement, TcTauType) -> TcM (LHsExpr TcId) + -> TcTauType -> TcM (LHsExpr TcId) -- A wrapper that deals with the refinement (if any) -tcGuardedCmd env expr stk (reft, res_ty) - = do { let (co, res_ty') = refineResType reft res_ty - ; body <- tcCmd env expr (stk, res_ty') - ; return (mkLHsWrap co body) } +tcGuardedCmd env expr stk res_ty + = do { body <- tcCmd env expr (stk, res_ty) + ; return body + } tcCmd :: CmdEnv -> LHsExpr Name -> (CmdStack, TcTauType) -> TcM (LHsExpr TcId) -- The main recursive function @@ -125,12 +130,11 @@ tc_cmd env (HsLet binds (L body_loc body)) res_ty ; return (HsLet binds' (L body_loc body')) } tc_cmd env in_cmd@(HsCase scrut matches) (stk, res_ty) - = addErrCtxt (cmdCtxt in_cmd) $ - addErrCtxt (caseScrutCtxt scrut) ( - tcInferRho scrut - ) `thenM` \ (scrut', scrut_ty) -> - tcMatchesCase match_ctxt scrut_ty matches res_ty `thenM` \ matches' -> - returnM (HsCase scrut' matches') + = addErrCtxt (cmdCtxt in_cmd) $ do + (scrut', scrut_ty) <- addErrCtxt (caseScrutCtxt scrut) $ + tcInferRho scrut + matches' <- tcMatchesCase match_ctxt scrut_ty matches res_ty + return (HsCase scrut' matches') where match_ctxt = MC { mc_what = CaseAlt, mc_body = mc_body } @@ -171,7 +175,6 @@ tc_cmd env cmd@(HsArrApp fun arg _ ho_app lr) (cmd_stk, res_ty) tc_cmd env cmd@(HsApp fun arg) (cmd_stk, res_ty) = addErrCtxt (cmdCtxt cmd) $ --- gaw 2004 FIX? do { arg_ty <- newFlexiTyVarTy openTypeKind ; fun' <- tcCmd env fun (arg_ty:cmd_stk, res_ty) @@ -203,7 +206,7 @@ tc_cmd env cmd@(HsLam (MatchGroup [L mtch_loc (match@(Match pats maybe_rhs_sig g where n_pats = length pats stk' = drop n_pats cmd_stk - match_ctxt = LambdaExpr -- Maybe KappaExpr? + match_ctxt = (LambdaExpr :: HsMatchContext Name) -- Maybe KappaExpr? pg_ctxt = PatGuard match_ctxt tc_grhss (GRHSs grhss binds) res_ty @@ -221,7 +224,7 @@ tc_cmd env cmd@(HsLam (MatchGroup [L mtch_loc (match@(Match pats maybe_rhs_sig g tc_cmd env cmd@(HsDo do_or_lc stmts body ty) (cmd_stk, res_ty) = do { checkTc (null cmd_stk) (nonEmptyCmdStkErr cmd) - ; (stmts', body') <- tcStmts do_or_lc tc_stmt stmts (emptyRefinement, res_ty) $ + ; (stmts', body') <- tcStmts do_or_lc tc_stmt stmts res_ty $ tcGuardedCmd env body [] ; return (HsDo do_or_lc stmts' body' res_ty) } where @@ -269,7 +272,7 @@ tc_cmd env cmd@(HsArrForm expr fixity cmd_args) (cmd_stk, res_ty) -- the s1..sm and check each cmd ; cmds' <- mapM (tc_cmd w_tv) cmds_w_tys - ; returnM (HsArrForm (noLoc $ HsWrap (WpTyLam w_tv) + ; return (HsArrForm (noLoc $ HsWrap (WpTyLam w_tv) (unLoc $ mkHsDictLet inst_binds expr')) fixity cmds') } @@ -298,7 +301,7 @@ tc_cmd env cmd@(HsArrForm expr fixity cmd_args) (cmd_stk, res_ty) not (w_tv `elemVarSet` tyVarsOfTypes arg_tys)) (badFormFun i tup_ty') - ; tcCmdTop (env { cmd_arr = b }) cmd arg_tys (emptyRefinement, s) } + ; tcCmdTop (env { cmd_arr = b }) cmd arg_tys s } unscramble :: TcType -> (TcType, [TcType]) -- unscramble ((w,s1) .. sn) = (w, [s1..sn])