|
|
|
|
Synopsis |
|
type TcType = Type | | type TcSigmaType = TcType | | type TcRhoType = TcType | | type TcTauType = TcType | | type TcPredType = PredType | | type TcThetaType = ThetaType | | type TcTyVar = TyVar | | type TcTyVarSet = TyVarSet | | type TcKind = Kind | | type BoxyTyVar = TcTyVar | | type BoxySigmaType = TcType | | type BoxyRhoType = TcType | | type BoxyThetaType = TcThetaType | | type BoxyType = TcType | | | | pprUserTypeCtxt :: UserTypeCtxt -> SDoc | | | | | | pprTcTyVarDetails :: TcTyVarDetails -> SDoc | | | | | | pprSkolTvBinding :: TcTyVar -> SDoc | | pprSkolInfo :: SkolemInfo -> SDoc | | isImmutableTyVar :: TyVar -> Bool | | isSkolemTyVar :: TcTyVar -> Bool | | isMetaTyVar :: TcTyVar -> Bool | | isBoxyTyVar :: TcTyVar -> Bool | | isSigTyVar :: Var -> Bool | | isExistentialTyVar :: TcTyVar -> Bool | | isTyConableTyVar :: TcTyVar -> Bool | | metaTvRef :: TyVar -> IORef MetaDetails | | isFlexi :: MetaDetails -> Bool | | isIndirect :: MetaDetails -> Bool | | isRuntimeUnk :: TyVar -> Bool | | isUnk :: TyVar -> Bool | | mkPhiTy :: [PredType] -> Type -> Type | | mkSigmaTy :: [TyVar] -> [PredType] -> Type -> Type | | tcView :: Type -> Maybe Type | | tcSplitForAllTys :: Type -> ([TyVar], Type) | | tcSplitPhiTy :: Type -> (ThetaType, Type) | | tcSplitPredFunTy_maybe :: Type -> Maybe (PredType, Type) | | tcSplitFunTy_maybe :: Type -> Maybe (Type, Type) | | tcSplitFunTys :: Type -> ([Type], Type) | | tcFunArgTy :: Type -> Type | | tcFunResultTy :: Type -> Type | | tcSplitFunTysN :: TcRhoType -> Arity -> ([TcSigmaType], TcSigmaType) | | tcSplitTyConApp :: Type -> (TyCon, [Type]) | | tcSplitTyConApp_maybe :: Type -> Maybe (TyCon, [Type]) | | tcTyConAppTyCon :: Type -> TyCon | | tcTyConAppArgs :: Type -> [Type] | | tcSplitAppTy_maybe :: Type -> Maybe (Type, Type) | | tcSplitAppTy :: Type -> (Type, Type) | | tcSplitAppTys :: Type -> (Type, [Type]) | | repSplitAppTy_maybe :: Type -> Maybe (Type, Type) | | tcInstHeadTyNotSynonym :: Type -> Bool | | tcInstHeadTyAppAllTyVars :: Type -> Bool | | tcGetTyVar_maybe :: Type -> Maybe TyVar | | tcGetTyVar :: String -> Type -> TyVar | | tcSplitSigmaTy :: Type -> ([TyVar], ThetaType, Type) | | tcMultiSplitSigmaTy :: TcSigmaType -> ([([TyVar], ThetaType)], TcSigmaType) | | tcEqType :: Type -> Type -> Bool | | tcEqTypes :: [Type] -> [Type] -> Bool | | tcEqPred :: PredType -> PredType -> Bool | | tcCmpType :: Type -> Type -> Ordering | | tcCmpTypes :: [Type] -> [Type] -> Ordering | | tcCmpPred :: PredType -> PredType -> Ordering | | tcEqTypeX :: RnEnv2 -> Type -> Type -> Bool | | eqKind :: Kind -> Kind -> Bool | | isSigmaTy :: Type -> Bool | | isOverloadedTy :: Type -> Bool | | isRigidTy :: TcType -> Bool | | isBoxyTy :: TcType -> Bool | | isDoubleTy :: Type -> Bool | | isFloatTy :: Type -> Bool | | isIntTy :: Type -> Bool | | isWordTy :: Type -> Bool | | isStringTy :: Type -> Bool | | isIntegerTy :: Type -> Bool | | isBoolTy :: Type -> Bool | | isUnitTy :: Type -> Bool | | isCharTy :: Type -> Bool | | isTauTy :: Type -> Bool | | isTauTyCon :: TyCon -> Bool | | tcIsTyVarTy :: Type -> Bool | | tcIsForAllTy :: Type -> Bool | | isOpenSynTyConApp :: TcTauType -> Bool | | deNoteType :: Type -> Type | | tyClsNamesOfType :: Type -> NameSet | | tyClsNamesOfDFunHead :: Type -> NameSet | | getDFunTyKey :: Type -> OccName | | getClassPredTys_maybe :: PredType -> Maybe (Class, [Type]) | | getClassPredTys :: PredType -> (Class, [Type]) | | isClassPred :: PredType -> Bool | | isTyVarClassPred :: PredType -> Bool | | isEqPred :: PredType -> Bool | | mkDictTy :: Class -> [Type] -> Type | | tcSplitPredTy_maybe :: Type -> Maybe PredType | | isPredTy :: Type -> Bool | | isDictTy :: Type -> Bool | | isDictLikeTy :: Type -> Bool | | tcSplitDFunTy :: Type -> ([TyVar], [PredType], Class, [Type]) | | tcSplitDFunHead :: Type -> (Class, [Type]) | | predTyUnique :: PredType -> Unique | | mkClassPred :: Class -> [Type] -> PredType | | isInheritablePred :: PredType -> Bool | | isIPPred :: PredType -> Bool | | isRefineableTy :: TcType -> (Bool, Bool) | | isRefineablePred :: TcPredType -> Bool | | isFFIArgumentTy :: DynFlags -> Safety -> Type -> Bool | | isFFIImportResultTy :: DynFlags -> Type -> Bool | | isFFIExportResultTy :: Type -> Bool | | isFFIExternalTy :: Type -> Bool | | isFFIDynArgumentTy :: Type -> Bool | | isFFIDynResultTy :: Type -> Bool | | isFFIPrimArgumentTy :: DynFlags -> Type -> Bool | | isFFIPrimResultTy :: DynFlags -> Type -> Bool | | isFFILabelTy :: Type -> Bool | | isFFIDotnetTy :: DynFlags -> Type -> Bool | | isFFIDotnetObjTy :: Type -> Bool | | isFFITy :: Type -> Bool | | isFunPtrTy :: Type -> Bool | | tcSplitIOType_maybe :: Type -> Maybe (TyCon, Type, CoercionI) | | type Kind = Type | | unliftedTypeKind :: Kind | | liftedTypeKind :: Kind | | argTypeKind :: Kind | | openTypeKind :: Kind | | mkArrowKind :: Kind -> Kind -> Kind | | mkArrowKinds :: [Kind] -> Kind -> Kind | | isLiftedTypeKind :: Kind -> Bool | | isUnliftedTypeKind :: Kind -> Bool | | isSubOpenTypeKind :: Kind -> Bool | | isSubArgTypeKind :: Kind -> Bool | | isSubKind :: Kind -> Kind -> Bool | | splitKindFunTys :: Kind -> ([Kind], Kind) | | defaultKind :: Kind -> Kind | | kindVarRef :: KindVar -> IORef MetaDetails | | mkKindVar :: Unique -> IORef MetaDetails -> KindVar | | data Type | | | | type ThetaType = [PredType] | | mkForAllTy :: TyVar -> Type -> Type | | mkForAllTys :: [TyVar] -> Type -> Type | | mkFunTy :: Type -> Type -> Type | | mkFunTys :: [Type] -> Type -> Type | | zipFunTys :: Outputable a => [a] -> Type -> ([(a, Type)], Type) | | mkTyConApp :: TyCon -> [Type] -> Type | | mkAppTy :: Type -> Type -> Type | | mkAppTys :: Type -> [Type] -> Type | | applyTy :: Type -> Type -> Type | | applyTys :: Type -> [Type] -> Type | | mkTyVarTy :: TyVar -> Type | | mkTyVarTys :: [TyVar] -> [Type] | | mkTyConTy :: TyCon -> Type | | mkPredTy :: PredType -> Type | | mkPredTys :: ThetaType -> [Type] | | data TvSubst = TvSubst InScopeSet TvSubstEnv | | type TvSubstEnv = TyVarEnv Type | | emptyTvSubst :: TvSubst | | substEqSpec :: TvSubst -> [(TyVar, Type)] -> [(TcType, TcType)] | | mkOpenTvSubst :: TvSubstEnv -> TvSubst | | zipOpenTvSubst :: [TyVar] -> [Type] -> TvSubst | | zipTopTvSubst :: [TyVar] -> [Type] -> TvSubst | | mkTopTvSubst :: [(TyVar, Type)] -> TvSubst | | notElemTvSubst :: TyVar -> TvSubst -> Bool | | getTvSubstEnv :: TvSubst -> TvSubstEnv | | setTvSubstEnv :: TvSubst -> TvSubstEnv -> TvSubst | | getTvInScope :: TvSubst -> InScopeSet | | extendTvInScope :: TvSubst -> [Var] -> TvSubst | | lookupTyVar :: TvSubst -> TyVar -> Maybe Type | | extendTvSubst :: TvSubst -> TyVar -> Type -> TvSubst | | extendTvSubstList :: TvSubst -> [TyVar] -> [Type] -> TvSubst | | isInScope :: Var -> TvSubst -> Bool | | mkTvSubst :: InScopeSet -> TvSubstEnv -> TvSubst | | zipTyEnv :: [TyVar] -> [Type] -> TvSubstEnv | | substTy :: TvSubst -> Type -> Type | | substTys :: TvSubst -> [Type] -> [Type] | | substTyWith :: [TyVar] -> [Type] -> Type -> Type | | substTheta :: TvSubst -> ThetaType -> ThetaType | | substTyVar :: TvSubst -> TyVar -> Type | | substTyVars :: TvSubst -> [TyVar] -> [Type] | | substTyVarBndr :: TvSubst -> TyVar -> (TvSubst, TyVar) | | isUnLiftedType :: Type -> Bool | | isUnboxedTupleType :: Type -> Bool | | isPrimitiveType :: Type -> Bool | | tidyTopType :: Type -> Type | | tidyType :: TidyEnv -> Type -> Type | | tidyPred :: TidyEnv -> PredType -> PredType | | tidyTypes :: TidyEnv -> [Type] -> [Type] | | tidyFreeTyVars :: TidyEnv -> TyVarSet -> TidyEnv | | tidyOpenType :: TidyEnv -> Type -> (TidyEnv, Type) | | tidyOpenTypes :: TidyEnv -> [Type] -> (TidyEnv, [Type]) | | tidyTyVarBndr :: TidyEnv -> TyVar -> (TidyEnv, TyVar) | | tidyOpenTyVar :: TidyEnv -> TyVar -> (TidyEnv, TyVar) | | tidyOpenTyVars :: TidyEnv -> [TyVar] -> (TidyEnv, [TyVar]) | | tidySkolemTyVar :: TidyEnv -> TcTyVar -> (TidyEnv, TcTyVar) | | typeKind :: Type -> Kind | | tidyKind :: TidyEnv -> Kind -> (TidyEnv, Kind) | | tyVarsOfType :: Type -> TyVarSet | | tyVarsOfTypes :: [Type] -> TyVarSet | | tyVarsOfPred :: PredType -> TyVarSet | | tyVarsOfTheta :: ThetaType -> TyVarSet | | tcTyVarsOfType :: Type -> TcTyVarSet | | tcTyVarsOfTypes :: [Type] -> TyVarSet | | tcTyVarsOfPred :: PredType -> TyVarSet | | exactTyVarsOfType :: TcType -> TyVarSet | | exactTyVarsOfTypes :: [TcType] -> TyVarSet | | pprKind :: Kind -> SDoc | | pprParendKind :: Kind -> SDoc | | pprType :: Type -> SDoc | | pprParendType :: Type -> SDoc | | pprTypeApp :: NamedThing a => a -> [Type] -> SDoc | | pprTyThingCategory :: TyThing -> SDoc | | pprPred :: PredType -> SDoc | | pprTheta :: ThetaType -> SDoc | | pprThetaArrow :: ThetaType -> SDoc | | pprClassPred :: Class -> [Type] -> SDoc |
|
|
Documentation |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Constructors | FunSigCtxt Name | | ExprSigCtxt | | ConArgCtxt Name | | TySynCtxt Name | | GenPatCtxt | | LamPatSigCtxt | | BindPatSigCtxt | | ResSigCtxt | | ForSigCtxt Name | | DefaultDeclCtxt | | SpecInstCtxt | | ThBrackCtxt | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Constructors | | Instances | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Similar to coreView, but for the type checker, which just looks through synonyms
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Does the AppTy split as in splitAppTy_maybe, but assumes that
any Core view stuff is already done
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Type equality on source types. Does not look through newtypes or
PredTypes, but it does look through type synonyms.
|
|
|
|
|
|
|
Type ordering on source types. Does not look through newtypes or
PredTypes, but it does look through type synonyms.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The key type representing kinds in the compiler.
Invariant: a kind is always in one of these forms:
FunTy k1 k2
TyConApp PrimTyCon [...]
TyVar kv -- (during inference only)
ForAll ... -- (for top-level coercions)
|
|
|
See Type for details of the distinction between these Kinds
|
|
|
|
|
|
|
|
|
Given two kinds k1 and k2, creates the Kind k1 -> k2
|
|
|
Iterated application of mkArrowKind
|
|
|
|
|
|
|
True of any sub-kind of OpenTypeKind (i.e. anything except arrow)
|
|
|
True of any sub-kind of ArgTypeKind
|
|
|
k1 `isSubKind` k2 checks that k1 <: k2
|
|
|
Essentially splitFunTys on kinds
|
|
|
Used when generalising: default kind ? and ?? to *. See Type for more
information on what that means
|
|
|
|
|
|
|
The key representation of types within the compiler
| Instances | |
|
|
|
A type of the form PredTy p represents a value whose type is
the Haskell predicate p, where a predicate is what occurs before
the => in a Haskell type.
It can be expanded into its representation, but:
- The type checker must treat it as opaque
- The rest of the compiler treats it as transparent
Consider these examples:
f :: (Eq a) => a -> Int
g :: (?x :: Int -> Int) => a -> Int
h :: (r\l) => {r} => {l::Int | r}
Here the Eq a and ?x :: Int -> Int and rl are all called "predicates"
| Constructors | | Instances | |
|
|
|
A collection of PredTypes
|
|
|
|
|
Wraps foralls over the type using the provided TyVars from left to right
|
|
|
Creates a function type from the given argument and result type
|
|
|
|
|
Splits off argument types from the given type and associating
them with the things in the input list from left to right. The
final result type is returned, along with the resulting pairs of
objects and types, albeit with the list of pairs in reverse order.
Panics if there are not enough argument types for the input list.
|
|
|
A key function: builds a TyConApp or FunTy as apppropriate to its arguments.
Applies its arguments to the constructor from left to right
|
|
|
Applies a type to another, as in e.g. k a
|
|
|
|
|
Instantiate a forall type with one or more type arguments.
Used when we have a polymorphic function applied to type args:
f t1 t2
We use applyTys type-of-f [t1,t2] to compute the type of the expression.
Panics if no application is possible.
|
|
|
This function is interesting because:
1. The function may have more for-alls than there are args
2. Less obviously, it may have fewer for-alls
For case 2. think of:
applyTys (forall a.a) [forall b.b, Int]
This really can happen, via dressing up polymorphic types with newtype
clothing. Here's an example:
newtype R = R (forall a. a->a)
foo = case undefined :: R of
R f -> f ()
|
|
|
|
|
|
|
Create the plain type constructor type which has been applied to no type arguments at all.
|
|
|
|
|
|
|
Type substitution
The following invariants must hold of a TvSubst:
1. The in-scope set is needed only to
guide the generation of fresh uniques
2. In particular, the kind of the type variables in
the in-scope set is not relevant
3. The substition is only applied ONCE! This is because
in general such application will not reached a fixed point.
| Constructors | | Instances | |
|
|
|
A substitition of Types for TyVars
|
|
|
|
|
|
|
Generates the in-scope set for the TvSubst from the types in the incoming
environment, hence open
|
|
|
Generates the in-scope set for the TvSubst from the types in the incoming
environment, hence open
|
|
|
|
|
Called when doing top-level substitutions. Here we expect that the
free vars of the range of the substitution will be empty.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Substitute within a Type
|
|
|
Substitute within several Types
|
|
|
Type substitution making use of an TvSubst that
is assumed to be open, see zipOpenTvSubst
|
|
|
Substitute within a ThetaType
|
|
|
|
|
|
|
|
|
See Type for what an unlifted type is
|
|
|
|
|
Returns true of types that are opaque to Haskell.
Most of these are unlifted, but now that we interact with .NET, we
may have primtive (foreign-imported) types that are lifted
|
|
|
Calls tidyType on a top-level type (i.e. with an empty tidying environment)
|
|
|
|
|
|
|
|
|
Add the free TyVars to the env in tidy form,
so that we can tidy the type they are free in
|
|
|
Grabs the free type variables, tidies them
and then uses tidyType to work over the type itself
|
|
|
|
|
This tidies up a type for printing in an error message, or in
an interface file.
It doesn't change the uniques at all, just the print names.
|
|
|
Treat a new TyVar as a binder, and give it a fresh tidy name
using the environment if one has not already been allocated. See
also tidyTyVarBndr
|
|
|
|
|
|
|
|
|
|
|
NB: for type synonyms tyVarsOfType does not expand the synonym
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Produced by Haddock version 2.6.1 |