diff options
author | Joachim Breitner <mail@joachim-breitner.de> | 2018-01-22 19:02:30 -0500 |
---|---|---|
committer | Joachim Breitner <mail@joachim-breitner.de> | 2018-01-22 19:02:30 -0500 |
commit | 071962d30c9ac5d9ee0dedc5df0d6ce3d2e1bc0a (patch) | |
tree | 06c527b96b00a7c28e4f1c9c2605512e7fff2a15 | |
parent | 2e5bc02c38c05f7d12d046f1934eac20910c93ca (diff) | |
download | haskell-071962d30c9ac5d9ee0dedc5df0d6ce3d2e1bc0a.tar.gz |
Use EvExpr instead of EvTerm where possible
to clutter the code less with calls to the EvExpr constructors.
-rw-r--r-- | compiler/typecheck/Inst.hs | 2 | ||||
-rw-r--r-- | compiler/typecheck/TcCanonical.hs | 17 | ||||
-rw-r--r-- | compiler/typecheck/TcEvidence.hs | 8 | ||||
-rw-r--r-- | compiler/typecheck/TcInteract.hs | 6 | ||||
-rw-r--r-- | compiler/typecheck/TcPatSyn.hs | 2 | ||||
-rw-r--r-- | compiler/typecheck/TcSMonad.hs | 10 |
6 files changed, 22 insertions, 23 deletions
diff --git a/compiler/typecheck/Inst.hs b/compiler/typecheck/Inst.hs index a68b80deff..560dc222f6 100644 --- a/compiler/typecheck/Inst.hs +++ b/compiler/typecheck/Inst.hs @@ -350,7 +350,7 @@ instCallConstraints orig preds | otherwise = do { evs <- mapM go preds ; traceTc "instCallConstraints" (ppr evs) - ; return (mkWpEvApps (map EvExpr evs)) } + ; return (mkWpEvApps evs) } where go pred | Just (Nominal, ty1, ty2) <- getEqPredTys_maybe pred -- Try short-cut #1 diff --git a/compiler/typecheck/TcCanonical.hs b/compiler/typecheck/TcCanonical.hs index 2ef4d31f80..d795498e9f 100644 --- a/compiler/typecheck/TcCanonical.hs +++ b/compiler/typecheck/TcCanonical.hs @@ -19,7 +19,6 @@ import Type import TcFlatten import TcSMonad import TcEvidence -import TcEvTerm import Class import TyCon import TyCoRep -- cleverly decomposes types, good for completeness checking @@ -992,9 +991,9 @@ can_eq_app ev NomEq s1 t1 s2 t2 co_s = mkTcLRCo CLeft co co_t = mkTcLRCo CRight co ; evar_s <- newGivenEvVar loc ( mkTcEqPredLikeEv ev s1 s2 - , EvExpr $ evCoercion co_s ) + , evCoercion co_s ) ; evar_t <- newGivenEvVar loc ( mkTcEqPredLikeEv ev t1 t2 - , EvExpr $ evCoercion co_t ) + , evCoercion co_t ) ; emitWorkNC [evar_t] ; canEqNC evar_s NomEq s1 s2 } | otherwise -- Can't happen @@ -1264,7 +1263,7 @@ canDecomposableTyConAppOK ev eq_rel tc tys1 tys2 -> do { let ev_co = mkCoVarCo evar ; given_evs <- newGivenEvVars loc $ [ ( mkPrimEqPredRole r ty1 ty2 - , EvExpr $ evCoercion $ mkNthCo i ev_co ) + , evCoercion $ mkNthCo i ev_co ) | (r, ty1, ty2, i) <- zip4 tc_roles tys1 tys2 [0..] , r /= Phantom , not (isCoercionTy ty1) && not (isCoercionTy ty2) ] @@ -1459,7 +1458,7 @@ canEqTyVar ev eq_rel swapped tv1 co1 ps_ty1 xi2 ps_xi2 -- unswapped: tm :: (lhs :: k1) ~ (rhs :: k2) -- swapped : tm :: (rhs :: k2) ~ (lhs :: k1) = do { kind_ev_id <- newBoundEvVarId kind_pty - (EvExpr $ evCoercion $ + (evCoercion $ if isSwapped swapped then mkTcSymCo $ mkTcKindCo $ mkTcCoVarCo evar else mkTcKindCo $ mkTcCoVarCo evar) @@ -1476,10 +1475,10 @@ canEqTyVar ev eq_rel swapped tv1 co1 ps_ty1 xi2 ps_xi2 ; type_ev <- newGivenEvVar loc $ if isSwapped swapped then ( mkTcEqPredLikeEv ev rhs' lhs - , EvExpr $ evCoercion $ + , evCoercion $ mkTcCoherenceLeftCo (mkTcCoVarCo evar) homo_co ) else ( mkTcEqPredLikeEv ev lhs rhs' - , EvExpr $ evCoercion $ + , evCoercion $ mkTcCoherenceRightCo (mkTcCoVarCo evar) homo_co ) -- unswapped: type_ev :: (lhs :: k1) ~ ((rhs |> sym kind_ev_id) :: k1) -- swapped : type_ev :: ((rhs |> sym kind_ev_id) :: k1) ~ (lhs :: k1) @@ -1852,7 +1851,7 @@ rewriteEvidence old_ev new_pred co = continueWith (old_ev { ctev_pred = new_pred }) rewriteEvidence ev@(CtGiven { ctev_evar = old_evar, ctev_loc = loc }) new_pred co - = do { new_ev <- newGivenEvVar loc (new_pred, (EvExpr new_tm)) + = do { new_ev <- newGivenEvVar loc (new_pred, new_tm) ; continueWith new_ev } where -- mkEvCast optimises ReflCo @@ -1908,7 +1907,7 @@ rewriteEqEvidence old_ev swapped nlhs nrhs lhs_co rhs_co = do { let new_tm = evCoercion (lhs_co `mkTcTransCo` maybeSym swapped (mkTcCoVarCo old_evar) `mkTcTransCo` mkTcSymCo rhs_co) - ; new_ev <- newGivenEvVar loc' (new_pred, EvExpr new_tm) + ; new_ev <- newGivenEvVar loc' (new_pred, new_tm) ; continueWith new_ev } | CtWanted { ctev_dest = dest } <- old_ev diff --git a/compiler/typecheck/TcEvidence.hs b/compiler/typecheck/TcEvidence.hs index 8f29de9c0e..752b0efe8d 100644 --- a/compiler/typecheck/TcEvidence.hs +++ b/compiler/typecheck/TcEvidence.hs @@ -316,8 +316,8 @@ mkWpCastN co mkWpTyApps :: [Type] -> HsWrapper mkWpTyApps tys = mk_co_app_fn WpTyApp tys -mkWpEvApps :: [EvTerm] -> HsWrapper -mkWpEvApps args = mk_co_app_fn WpEvApp args +mkWpEvApps :: [EvExpr] -> HsWrapper +mkWpEvApps args = mk_co_app_fn WpEvApp (map EvExpr args) mkWpEvVarApps :: [EvVar] -> HsWrapper mkWpEvVarApps vs = mk_co_app_fn WpEvApp (map (EvExpr . evId) vs) @@ -755,11 +755,11 @@ mkEvCast ev lco isTcReflCo lco = ev | otherwise = evCast ev lco -mkEvScSelectors :: EvExpr -> Class -> [TcType] -> [(TcPredType, EvTerm)] +mkEvScSelectors :: EvExpr -> Class -> [TcType] -> [(TcPredType, EvExpr)] mkEvScSelectors ev cls tys = zipWith mk_pr (immSuperClasses cls tys) [0..] where - mk_pr pred i = (pred, EvExpr (evSuperClass ev i)) + mk_pr pred i = (pred, evSuperClass ev i) emptyTcEvBinds :: TcEvBinds emptyTcEvBinds = EvBinds emptyBag diff --git a/compiler/typecheck/TcInteract.hs b/compiler/typecheck/TcInteract.hs index 7b58cc6ad8..7ff8a62ef0 100644 --- a/compiler/typecheck/TcInteract.hs +++ b/compiler/typecheck/TcInteract.hs @@ -1362,7 +1362,7 @@ reactFunEq from_this fsk1 solve_this fsk2 fsk_eq_pred = mkTcEqPredLikeEv solve_this (mkTyVarTy fsk2) (mkTyVarTy fsk1) - ; new_ev <- newGivenEvVar loc (fsk_eq_pred, EvExpr $ evCoercion fsk_eq_co) + ; new_ev <- newGivenEvVar loc (fsk_eq_pred, evCoercion fsk_eq_co) ; emitWorkNC [new_ev] } | CtDerived { ctev_loc = loc } <- solve_this @@ -1826,7 +1826,7 @@ reduce_top_fun_eq old_ev fsk (ax_co, rhs_ty) = do { let final_co = mkTcSymCo (ctEvCoercion old_ev) `mkTcTransCo` ax_co -- final_co :: fsk ~ rhs_ty ; new_ev <- newGivenEvVar deeper_loc (mkPrimEqPred (mkTyVarTy fsk) rhs_ty, - EvExpr (evCoercion final_co)) + evCoercion final_co) ; emitWorkNC [new_ev] -- Non-cannonical; that will mean we flatten rhs_ty ; stopWith old_ev "Fun/Top (given)" } @@ -1949,7 +1949,7 @@ shortCutReduction old_ev fsk ax_co fam_tc tc_args ; new_ev <- case ctEvFlavour old_ev of Given -> newGivenEvVar deeper_loc ( mkPrimEqPred (mkTyConApp fam_tc xis) (mkTyVarTy fsk) - , EvExpr $ evCoercion (mkTcTyConAppCo Nominal fam_tc cos + , evCoercion (mkTcTyConAppCo Nominal fam_tc cos `mkTcTransCo` mkTcSymCo ax_co `mkTcTransCo` ctEvCoercion old_ev) ) diff --git a/compiler/typecheck/TcPatSyn.hs b/compiler/typecheck/TcPatSyn.hs index 1aadf8cc23..1e2d85e323 100644 --- a/compiler/typecheck/TcPatSyn.hs +++ b/compiler/typecheck/TcPatSyn.hs @@ -660,7 +660,7 @@ tcPatSynMatcher (L loc name) lpat matcher_id = mkExportedVanillaId matcher_name matcher_sigma -- See Note [Exported LocalIds] in Id - inst_wrap = mkWpEvApps (map EvExpr prov_dicts) <.> mkWpTyApps ex_tys + inst_wrap = mkWpEvApps prov_dicts <.> mkWpTyApps ex_tys cont' = foldl nlHsApp (mkLHsWrap inst_wrap (nlHsVar cont)) cont_args fail' = nlHsApps fail [nlHsVar voidPrimId] diff --git a/compiler/typecheck/TcSMonad.hs b/compiler/typecheck/TcSMonad.hs index 90592d711a..3142567ddb 100644 --- a/compiler/typecheck/TcSMonad.hs +++ b/compiler/typecheck/TcSMonad.hs @@ -2876,7 +2876,7 @@ newFlattenSkolem flav loc tc xis -- Construct the Refl evidence ; let pred = mkPrimEqPred fam_ty (mkTyVarTy fsk) co = mkNomReflCo fam_ty - ; ev <- newGivenEvVar loc (pred, EvExpr (evCoercion co)) + ; ev <- newGivenEvVar loc (pred, evCoercion co) ; return (ev, co, fsk) } | otherwise -- Generate a [WD] for both Wanted and Derived @@ -3051,7 +3051,7 @@ newTcEvBinds = wrapTcS TcM.newTcEvBinds newEvVar :: TcPredType -> TcS EvVar newEvVar pred = wrapTcS (TcM.newEvVar pred) -newGivenEvVar :: CtLoc -> (TcPredType, EvTerm) -> TcS CtEvidence +newGivenEvVar :: CtLoc -> (TcPredType, EvExpr) -> TcS CtEvidence -- Make a new variable of the given PredType, -- immediately bind it to the given term -- and return its CtEvidence @@ -3062,13 +3062,13 @@ newGivenEvVar loc (pred, rhs) -- | Make a new 'Id' of the given type, bound (in the monad's EvBinds) to the -- given term -newBoundEvVarId :: TcPredType -> EvTerm -> TcS EvVar +newBoundEvVarId :: TcPredType -> EvExpr -> TcS EvVar newBoundEvVarId pred rhs = do { new_ev <- newEvVar pred - ; setEvBind (mkGivenEvBind new_ev rhs) + ; setEvBind (mkGivenEvBind new_ev (EvExpr rhs)) ; return new_ev } -newGivenEvVars :: CtLoc -> [(TcPredType, EvTerm)] -> TcS [CtEvidence] +newGivenEvVars :: CtLoc -> [(TcPredType, EvExpr)] -> TcS [CtEvidence] newGivenEvVars loc pts = mapM (newGivenEvVar loc) pts emitNewWantedEq :: CtLoc -> Role -> TcType -> TcType -> TcS Coercion |