X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypes%2FType.lhs;h=37f915be1dfca92944994916e3bc02fe5a1d3fae;hb=19e7eb5734f11505cea7a3405eb8e8610bc80234;hp=db90b8c828062c776604586e98437bd8226a0eb7;hpb=fa56e2107bd1b097580fbd2cf2c5760a772cc402;p=ghc-hetmet.git diff --git a/compiler/types/Type.lhs b/compiler/types/Type.lhs index db90b8c..37f915b 100644 --- a/compiler/types/Type.lhs +++ b/compiler/types/Type.lhs @@ -54,8 +54,7 @@ module Type ( applyTy, applyTys, isForAllTy, dropForAlls, -- Source types - predTypeRep, mkPredTy, mkPredTys, - tyConOrigHead, pprSourceTyCon, + predTypeRep, mkPredTy, mkPredTys, pprSourceTyCon, mkFamilyTyConApp, -- Newtypes splitRecNewType_maybe, newTyConInstRhs, @@ -604,20 +603,27 @@ predTypeRep (ClassP clas tys) = mkTyConApp (classTyCon clas) tys -- look through that too if necessary predTypeRep (EqPred ty1 ty2) = pprPanic "predTypeRep" (ppr (EqPred ty1 ty2)) --- The original head is the tycon and its variables for a vanilla tycon and it --- is the family tycon and its type indexes for a family instance. -tyConOrigHead :: TyCon -> (TyCon, [Type]) -tyConOrigHead tycon = case tyConFamInst_maybe tycon of - Nothing -> (tycon, mkTyVarTys (tyConTyVars tycon)) - Just famInst -> famInst +mkFamilyTyConApp :: TyCon -> [Type] -> Type +-- Given a family instance TyCon and its arg types, return the +-- corresponding family type. E.g. +-- data family T a +-- data instance T (Maybe b) = MkT b -- Instance tycon :RTL +-- Then +-- mkFamilyTyConApp :RTL Int = T (Maybe Int) +mkFamilyTyConApp tc tys + | Just (fam_tc, fam_tys) <- tyConFamInst_maybe tc + , let fam_subst = zipTopTvSubst (tyConTyVars tc) tys + = mkTyConApp fam_tc (substTys fam_subst fam_tys) + | otherwise + = mkTyConApp tc tys -- Pretty prints a tycon, using the family instance in case of a -- representation tycon. For example -- e.g. data T [a] = ... -- In that case we want to print `T [a]', where T is the family TyCon pprSourceTyCon tycon - | Just (repTyCon, tys) <- tyConFamInst_maybe tycon - = ppr $ repTyCon `TyConApp` tys -- can't be FunTyCon + | Just (fam_tc, tys) <- tyConFamInst_maybe tycon + = ppr $ fam_tc `TyConApp` tys -- can't be FunTyCon | otherwise = ppr tycon \end{code} @@ -645,9 +651,6 @@ splitRecNewType_maybe (TyConApp tc tys) Just (substTyWith tvs tys rep_ty) splitRecNewType_maybe other = Nothing - - - \end{code} @@ -1221,7 +1224,7 @@ zipTopTvSubst :: [TyVar] -> [Type] -> TvSubst zipTopTvSubst tyvars tys #ifdef DEBUG | length tyvars /= length tys - = pprTrace "zipOpenTvSubst" (ppr tyvars $$ ppr tys) emptyTvSubst + = pprTrace "zipTopTvSubst" (ppr tyvars $$ ppr tys) emptyTvSubst | otherwise #endif = TvSubst emptyInScopeSet (zipTyEnv tyvars tys)