[commit: ghc] ghc-kinds: tyVarsOfType returns all variables, even in kinds (1876794)
Julien Cretin
julien at galois.com
Fri Sep 16 10:27:40 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/ghc
On branch : ghc-kinds
http://hackage.haskell.org/trac/ghc/changeset/1876794f60707806bda9eeadb780a66564fba6ca
>---------------------------------------------------------------
commit 1876794f60707806bda9eeadb780a66564fba6ca
Author: Julien Cretin <ghc at ia0.eu>
Date: Wed Sep 14 11:52:28 2011 +0200
tyVarsOfType returns all variables, even in kinds
>---------------------------------------------------------------
compiler/types/TypeRep.lhs | 23 +++++++++++++++++++++--
1 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/compiler/types/TypeRep.lhs b/compiler/types/TypeRep.lhs
index 7007bb8..e6b8edd 100644
--- a/compiler/types/TypeRep.lhs
+++ b/compiler/types/TypeRep.lhs
@@ -28,6 +28,7 @@ module TypeRep (
-- Free variables
tyVarsOfType, tyVarsOfTypes,
+ tyVarsOfTypeStratified, tyVarsOfTypesStratified,
-- Substitutions
TvSubst(..), TvSubstEnv
@@ -288,14 +289,32 @@ isLiftedTypeKind _ = False
\begin{code}
tyVarsOfType :: Type -> VarSet
-- ^ NB: for type synonyms tyVarsOfType does /not/ expand the synonym
-tyVarsOfType (TyVarTy v) = unitVarSet v
+-- tyVarsOfType returns variables at any level (types or kinds)
+-- see tyVarsOfTypeStratified for a function that returns only current level variables
+tyVarsOfType (TyVarTy v) = unitVarSet v `unionVarSet` tyVarsOfType (tyVarKind v)
tyVarsOfType (TyConApp _ tys) = tyVarsOfTypes tys
tyVarsOfType (FunTy arg res) = tyVarsOfType arg `unionVarSet` tyVarsOfType res
tyVarsOfType (AppTy fun arg) = tyVarsOfType fun `unionVarSet` tyVarsOfType arg
-tyVarsOfType (ForAllTy tyvar ty) = delVarSet (tyVarsOfType ty) tyvar
+tyVarsOfType (ForAllTy tyvar ty) = delVarSet (tyVarsOfType ty) tyvar `unionVarSet` tyVarsOfType (tyVarKind tyvar)
tyVarsOfTypes :: [Type] -> TyVarSet
tyVarsOfTypes tys = foldr (unionVarSet . tyVarsOfType) emptyVarSet tys
+
+tyVarsOfTypeStratified :: Type -> VarSet
+-- only returns variables of the current level (don't look in kind signatures)
+tyVarsOfTypeStratified (TyVarTy v)
+ = unitVarSet v
+tyVarsOfTypeStratified (TyConApp _ tys)
+ = tyVarsOfTypesStratified tys
+tyVarsOfTypeStratified (FunTy arg res)
+ = tyVarsOfTypeStratified arg `unionVarSet` tyVarsOfTypeStratified res
+tyVarsOfTypeStratified (AppTy fun arg)
+ = tyVarsOfTypeStratified fun `unionVarSet` tyVarsOfTypeStratified arg
+tyVarsOfTypeStratified (ForAllTy tyvar ty)
+ = delVarSet (tyVarsOfTypeStratified ty) tyvar
+
+tyVarsOfTypesStratified :: [Type] -> VarSet
+tyVarsOfTypesStratified tys = foldr (unionVarSet . tyVarsOfTypeStratified) emptyVarSet tys
\end{code}
%************************************************************************
More information about the Cvs-ghc
mailing list