-- They are all, therefore, wired-in TyCons. C.f module TysWiredIn
module TysPrim(
alphaTyVars, betaTyVars, alphaTyVar, betaTyVar, gammaTyVar, deltaTyVar,
- alphaTy, betaTy, gammaTy, deltaTy,
+ alphaTy, betaTy, gammaTy, deltaTy, ecTyVars,
openAlphaTy, openBetaTy, openAlphaTyVar, openBetaTyVar, openAlphaTyVars,
+ argAlphaTy, argAlphaTyVar, argBetaTy, argBetaTyVar,
primTyCons,
word64PrimTyCon, word64PrimTy,
-- * Any
- anyTyCon, anyType, anyTyConOfKind, anyTypeOfKind
+ anyTyCon, anyTyConOfKind, anyTypeOfKind
) where
#include "HsVersions.h"
import OccName ( mkTyVarOccFS, mkTcOccFS )
import TyCon ( TyCon, mkPrimTyCon, mkLiftedPrimTyCon, mkAnyTyCon )
import Type
+import TypeRep ( ecKind )
import Coercion
import SrcLoc
import Unique ( mkAlphaTyVarUnique )
where c = chr (u-2 + ord 'a')
]
+ecTyVars :: [TyVar]
+ecTyVars = tyVarList ecKind
+
alphaTyVars :: [TyVar]
alphaTyVars = tyVarList liftedTypeKind
openAlphaTy, openBetaTy :: Type
openAlphaTy = mkTyVarTy openAlphaTyVar
-openBetaTy = mkTyVarTy openBetaTyVar
+openBetaTy = mkTyVarTy openBetaTyVar
+
+argAlphaTyVar, argBetaTyVar :: TyVar
+(argAlphaTyVar : argBetaTyVar : _) = tyVarList argTypeKind
+argAlphaTy, argBetaTy :: Type
+argAlphaTy = mkTyVarTy argAlphaTyVar
+argBetaTy = mkTyVarTy argBetaTyVar
\end{code}
to have a Unique. Unlike tuples (which are also an infinite family)
there is no convenient way to index them, so we use the Unique from
their OccName instead. That should be unique,
-
- both wrt each other, because their strings differ
- and wrt any other Name, because Names get uniques with
anyTyCon :: TyCon
anyTyCon = mkLiftedPrimTyCon anyTyConName liftedTypeKind 0 PtrRep
-anyType :: Type
-anyType = mkTyConApp anyTyCon []
-
anyTypeOfKind :: Kind -> Type
-anyTypeOfKind kind
- | isLiftedTypeKind kind = anyType
- | otherwise = mkTyConApp (mk_any_tycon kind) []
+anyTypeOfKind kind = mkTyConApp (anyTyConOfKind kind) []
anyTyConOfKind :: Kind -> TyCon
+-- Map all superkinds of liftedTypeKind to liftedTypeKind
anyTyConOfKind kind
- | isLiftedTypeKind kind = anyTyCon
- | otherwise = mk_any_tycon kind
-
-mk_any_tycon :: Kind -> TyCon
-mk_any_tycon kind -- Kind other than *
- = tycon
+ | liftedTypeKind `isSubKind` kind = anyTyCon
+ | otherwise = tycon
where
-- Derive the name from the kind, thus:
-- Any(*->*), Any(*->*->*)