diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2014-10-29 16:34:05 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2014-11-04 10:37:57 +0000 |
commit | 33dcb810c72e448c8db74decce8f1acef5e9295e (patch) | |
tree | 656626a8673de0043f4ea7b51ae788b42d1f5270 | |
parent | fd46acf1c30d81ce0ac676c5ca7ffe6e3c82ad25 (diff) | |
download | haskell-33dcb810c72e448c8db74decce8f1acef5e9295e.tar.gz |
Simplify the API for tcInstTyVars, and make it more consistent with other similar functions
-rw-r--r-- | compiler/ghci/RtClosureInspect.hs | 10 | ||||
-rw-r--r-- | compiler/typecheck/Inst.lhs | 9 | ||||
-rw-r--r-- | compiler/typecheck/TcExpr.lhs | 18 | ||||
-rw-r--r-- | compiler/typecheck/TcMType.lhs | 10 | ||||
-rw-r--r-- | compiler/typecheck/TcPat.lhs | 17 |
5 files changed, 33 insertions, 31 deletions
diff --git a/compiler/ghci/RtClosureInspect.hs b/compiler/ghci/RtClosureInspect.hs index 0b69492b0a..1f751d1d23 100644 --- a/compiler/ghci/RtClosureInspect.hs +++ b/compiler/ghci/RtClosureInspect.hs @@ -596,7 +596,7 @@ liftTcM = id newVar :: Kind -> TR TcType newVar = liftTcM . newFlexiTyVarTy -instTyVars :: [TyVar] -> TR ([TcTyVar], [TcType], TvSubst) +instTyVars :: [TyVar] -> TR (TvSubst, [TcTyVar]) -- Instantiate fresh mutable type variables from some TyVars -- This function preserves the print-name, which helps error messages instTyVars = liftTcM . tcInstTyVars @@ -613,7 +613,7 @@ type RttiInstantiation = [(TcTyVar, TyVar)] -- mapping from new (instantiated) -to- old (skolem) type variables instScheme :: QuantifiedType -> TR (TcType, RttiInstantiation) instScheme (tvs, ty) - = liftTcM $ do { (tvs', _, subst) <- tcInstTyVars tvs + = liftTcM $ do { (subst, tvs') <- tcInstTyVars tvs ; let rtti_inst = [(tv',tv) | (tv',tv) <- tvs' `zip` tvs] ; return (substTy subst ty, rtti_inst) } @@ -950,7 +950,7 @@ getDataConArgTys dc con_app_ty = do { let UnaryRep rep_con_app_ty = repType con_app_ty ; traceTR (text "getDataConArgTys 1" <+> (ppr con_app_ty $$ ppr rep_con_app_ty $$ ppr (tcSplitTyConApp_maybe rep_con_app_ty))) - ; (_, _, subst) <- instTyVars (univ_tvs ++ ex_tvs) + ; (subst, _) <- instTyVars (univ_tvs ++ ex_tvs) ; addConstraint rep_con_app_ty (substTy subst (dataConOrigResTy dc)) -- See Note [Constructor arg types] ; let con_arg_tys = substTys subst (dataConRepArgTys dc) @@ -1183,8 +1183,8 @@ congruenceNewtypes lhs rhs = go lhs rhs >>= \rhs' -> return (lhs,rhs') | otherwise = do traceTR (text "(Upgrade) upgraded " <> ppr ty <> text " in presence of newtype evidence " <> ppr new_tycon) - (_, vars, _) <- instTyVars (tyConTyVars new_tycon) - let ty' = mkTyConApp new_tycon vars + (_, vars) <- instTyVars (tyConTyVars new_tycon) + let ty' = mkTyConApp new_tycon (mkTyVarTys vars) UnaryRep rep_ty = repType ty' _ <- liftTcM (unifyType ty rep_ty) -- assumes that reptype doesn't ^^^^ touch tyconApp args diff --git a/compiler/typecheck/Inst.lhs b/compiler/typecheck/Inst.lhs index 89955bffc6..ea2ca0bfa5 100644 --- a/compiler/typecheck/Inst.lhs +++ b/compiler/typecheck/Inst.lhs @@ -168,9 +168,14 @@ deeplyInstantiate :: CtOrigin -> TcSigmaType -> TcM (HsWrapper, TcRhoType) deeplyInstantiate orig ty | Just (arg_tys, tvs, theta, rho) <- tcDeepSplitSigmaTy_maybe ty - = do { (_, tys, subst) <- tcInstTyVars tvs + = do { (subst, tvs') <- tcInstTyVars tvs ; ids1 <- newSysLocalIds (fsLit "di") (substTys subst arg_tys) - ; wrap1 <- instCall orig tys (substTheta subst theta) + ; let theta' = substTheta subst theta + ; wrap1 <- instCall orig (mkTyVarTys tvs') theta' + ; traceTc "Instantiating (deply)" (vcat [ ppr ty + , text "with" <+> ppr tvs' + , text "args:" <+> ppr ids1 + , text "theta:" <+> ppr theta' ]) ; (wrap2, rho2) <- deeplyInstantiate orig (substTy subst rho) ; return (mkWpLams ids1 <.> wrap2 diff --git a/compiler/typecheck/TcExpr.lhs b/compiler/typecheck/TcExpr.lhs index 29020b4cb9..487ee4f356 100644 --- a/compiler/typecheck/TcExpr.lhs +++ b/compiler/typecheck/TcExpr.lhs @@ -698,7 +698,7 @@ tcExpr (RecordUpd record_expr rbinds _ _ _) res_ty mk_inst_ty :: TvSubst -> (TKVar, TcType) -> TcM (TvSubst, TcType) -- Deals with instantiation of kind variables - -- c.f. TcMType.tcInstTyVarsX + -- c.f. TcMType.tcInstTyVars mk_inst_ty subst (tv, result_inst_ty) | is_fixed_tv tv -- Same as result type = return (extendTvSubst subst tv result_inst_ty, result_inst_ty) @@ -706,7 +706,8 @@ tcExpr (RecordUpd record_expr rbinds _ _ _) res_ty = do { new_ty <- newFlexiTyVarTy (TcType.substTy subst (tyVarKind tv)) ; return (extendTvSubst subst tv new_ty, new_ty) } - ; (_, result_inst_tys, result_subst) <- tcInstTyVars con1_tvs + ; (result_subst, con1_tvs') <- tcInstTyVars con1_tvs + ; let result_inst_tys = mkTyVarTys con1_tvs' ; (scrut_subst, scrut_inst_tys) <- mapAccumLM mk_inst_ty emptyTvSubst (con1_tvs `zip` result_inst_tys) @@ -734,7 +735,7 @@ tcExpr (RecordUpd record_expr rbinds _ _ _) res_ty -- Phew! ; return $ mkHsWrapCo co_res $ RecordUpd (mkLHsWrap scrut_co record_expr') rbinds' - relevant_cons scrut_inst_tys result_inst_tys } + relevant_cons scrut_inst_tys result_inst_tys } where upd_fld_names = hsRecFields rbinds @@ -1111,11 +1112,12 @@ instantiateOuter orig id = return (HsVar id, tau) | otherwise - = do { (_, tys, subst) <- tcInstTyVars tvs - ; doStupidChecks id tys - ; let theta' = substTheta subst theta - ; traceTc "Instantiating" (ppr id <+> text "with" <+> (ppr tys $$ ppr theta')) - ; wrap <- instCall orig tys theta' + = do { (subst, tvs') <- tcInstTyVars tvs + ; let tys' = mkTyVarTys tvs' + theta' = substTheta subst theta + ; doStupidChecks id tys' + ; traceTc "Instantiating" (ppr id <+> text "with" <+> (ppr tys' $$ ppr theta')) + ; wrap <- instCall orig tys' theta' ; return (mkHsWrap wrap (HsVar id), TcType.substTy subst tau) } where (tvs, theta, tau) = tcSplitSigmaTy (idType id) diff --git a/compiler/typecheck/TcMType.lhs b/compiler/typecheck/TcMType.lhs index 301801ab91..2ba19a6ffe 100644 --- a/compiler/typecheck/TcMType.lhs +++ b/compiler/typecheck/TcMType.lhs @@ -437,22 +437,16 @@ newPolyFlexiTyVarTy :: TcM TcType newPolyFlexiTyVarTy = do { tv <- newMetaTyVar PolyTv liftedTypeKind ; return (TyVarTy tv) } -tcInstTyVars :: [TKVar] -> TcM ([TcTyVar], [TcType], TvSubst) +tcInstTyVars :: [TKVar] -> TcM (TvSubst, [TcTyVar]) -- Instantiate with META type variables -- Note that this works for a sequence of kind and type -- variables. Eg [ (k:BOX), (a:k->k) ] -- Gives [ (k7:BOX), (a8:k7->k7) ] -tcInstTyVars tyvars = tcInstTyVarsX emptyTvSubst tyvars +tcInstTyVars tyvars = mapAccumLM tcInstTyVarX emptyTvSubst tyvars -- emptyTvSubst has an empty in-scope set, but that's fine here -- Since the tyvars are freshly made, they cannot possibly be -- captured by any existing for-alls. -tcInstTyVarsX :: TvSubst -> [TKVar] -> TcM ([TcTyVar], [TcType], TvSubst) --- The "X" part is because of extending the substitution -tcInstTyVarsX subst tyvars = - do { (subst', tyvars') <- mapAccumLM tcInstTyVarX subst tyvars - ; return (tyvars', mkTyVarTys tyvars', subst') } - tcInstTyVarX :: TvSubst -> TKVar -> TcM (TvSubst, TcTyVar) -- Make a new unification variable tyvar whose Name and Kind come from -- an existing TyVar. We substitute kind variables in the kind. diff --git a/compiler/typecheck/TcPat.lhs b/compiler/typecheck/TcPat.lhs index 2f86f376bd..6fdbc5214c 100644 --- a/compiler/typecheck/TcPat.lhs +++ b/compiler/typecheck/TcPat.lhs @@ -787,7 +787,7 @@ tcPatSynPat :: PatEnv -> Located Name -> PatSyn tcPatSynPat penv (L con_span _) pat_syn pat_ty arg_pats thing_inside = do { let (univ_tvs, ex_tvs, prov_theta, req_theta, arg_tys, ty) = patSynSig pat_syn - ; (univ_tvs', inst_tys, subst) <- tcInstTyVars univ_tvs + ; (subst, univ_tvs') <- tcInstTyVars univ_tvs ; checkExistentials ex_tvs penv ; (tenv, ex_tvs') <- tcInstSuperSkolTyVarsX subst ex_tvs @@ -817,7 +817,7 @@ tcPatSynPat penv (L con_span _) pat_syn pat_ty arg_pats thing_inside LamPat mc -> PatSkol (PatSynCon pat_syn) mc LetPat {} -> UnkSkol -- Doesn't matter - ; req_wrap <- instCall PatOrigin inst_tys req_theta' + ; req_wrap <- instCall PatOrigin (mkTyVarTys univ_tvs') req_theta' ; traceTc "instCall" (ppr req_wrap) ; traceTc "checkConstraints {" Outputable.empty @@ -848,10 +848,10 @@ matchExpectedPatTy inner_match pat_ty -- that is the other way round to matchExpectedPatTy | otherwise - = do { (_, tys, subst) <- tcInstTyVars tvs - ; wrap1 <- instCall PatOrigin tys (substTheta subst theta) + = do { (subst, tvs') <- tcInstTyVars tvs + ; wrap1 <- instCall PatOrigin (mkTyVarTys tvs') (substTheta subst theta) ; (wrap2, arg_tys) <- matchExpectedPatTy inner_match (TcType.substTy subst tau) - ; return (wrap2 <.> wrap1 , arg_tys) } + ; return (wrap2 <.> wrap1, arg_tys) } where (tvs, theta, tau) = tcSplitSigmaTy pat_ty @@ -868,7 +868,7 @@ matchExpectedConTy data_tc pat_ty | Just (fam_tc, fam_args, co_tc) <- tyConFamInstSig_maybe data_tc -- Comments refer to Note [Matching constructor patterns] -- co_tc :: forall a. T [a] ~ T7 a - = do { (_, tys, subst) <- tcInstTyVars (tyConTyVars data_tc) + = do { (subst, tvs') <- tcInstTyVars (tyConTyVars data_tc) -- tys = [ty1,ty2] ; traceTc "matchExpectedConTy" (vcat [ppr data_tc, @@ -877,10 +877,11 @@ matchExpectedConTy data_tc pat_ty ; co1 <- unifyType (mkTyConApp fam_tc (substTys subst fam_args)) pat_ty -- co1 : T (ty1,ty2) ~ pat_ty - ; let co2 = mkTcUnbranchedAxInstCo Nominal co_tc tys + ; let tys' = mkTyVarTys tvs' + co2 = mkTcUnbranchedAxInstCo Nominal co_tc tys' -- co2 : T (ty1,ty2) ~ T7 ty1 ty2 - ; return (mkTcSymCo co2 `mkTcTransCo` co1, tys) } + ; return (mkTcSymCo co2 `mkTcTransCo` co1, tys') } | otherwise = matchExpectedTyConApp data_tc pat_ty |