TcType

ghc-7.10.3: The GHC API

Safe Haskell | None
Language | Haskell2010

TcType

Contents

- Finding type instances
- Finding "exact" (non-dead) type variables

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 TcCoVar = CoVar
- newtype TcLevel = TcLevel Int
- topTcLevel :: TcLevel
- pushTcLevel :: TcLevel -> TcLevel
- strictlyDeeperThan :: TcLevel -> TcLevel -> Bool
- sameDepthAs :: TcLevel -> TcLevel -> Bool
- fskTcLevel :: TcLevel
- data UserTypeCtxt
  - = FunSigCtxt Name
  - | InfSigCtxt Name
  - | ExprSigCtxt
  - | ConArgCtxt Name
  - | TySynCtxt Name
  - | PatSigCtxt
  - | RuleSigCtxt Name
  - | ResSigCtxt
  - | ForSigCtxt Name
  - | DefaultDeclCtxt
  - | InstDeclCtxt
  - | SpecInstCtxt
  - | ThBrackCtxt
  - | GenSigCtxt
  - | GhciCtxt
  - | ClassSCCtxt Name
  - | SigmaCtxt
  - | DataTyCtxt Name
- pprUserTypeCtxt :: UserTypeCtxt -> SDoc
- pprSigCtxt :: UserTypeCtxt -> SDoc -> SDoc -> SDoc
- data TcTyVarDetails
  - = SkolemTv Bool
  - | FlatSkol TcType
  - | RuntimeUnk
  - | MetaTv {
    - mtv_info :: MetaInfo
    - mtv_ref :: IORef MetaDetails
    - mtv_tclvl :: TcLevel
    }
- pprTcTyVarDetails :: TcTyVarDetails -> SDoc
- vanillaSkolemTv :: TcTyVarDetails
- superSkolemTv :: TcTyVarDetails
- data MetaDetails
  - = Flexi
  - | Indirect TcType
- data MetaInfo
  - = TauTv Bool
  - | ReturnTv
  - | SigTv
  - | FlatMetaTv
- isImmutableTyVar :: TyVar -> Bool
- isSkolemTyVar :: TcTyVar -> Bool
- isMetaTyVar :: TcTyVar -> Bool
- isMetaTyVarTy :: TcType -> Bool
- isTyVarTy :: Type -> Bool
- isSigTyVar :: Var -> Bool
- isOverlappableTyVar :: TcTyVar -> Bool
- isTyConableTyVar :: TcTyVar -> Bool
- isFskTyVar :: TcTyVar -> Bool
- isFmvTyVar :: TcTyVar -> Bool
- isFlattenTyVar :: TcTyVar -> Bool
- isReturnTyVar :: TcTyVar -> Bool
- isAmbiguousTyVar :: TcTyVar -> Bool
- metaTvRef :: TyVar -> IORef MetaDetails
- metaTyVarInfo :: TcTyVar -> MetaInfo
- isFlexi :: MetaDetails -> Bool
- isIndirect :: MetaDetails -> Bool
- isRuntimeUnkSkol :: TyVar -> Bool
- isTypeVar :: Var -> Bool
- isKindVar :: Var -> Bool
- metaTyVarTcLevel :: TcTyVar -> TcLevel
- setMetaTyVarTcLevel :: TcTyVar -> TcLevel -> TcTyVar
- metaTyVarTcLevel_maybe :: TcTyVar -> Maybe TcLevel
- isTouchableMetaTyVar :: TcLevel -> TcTyVar -> Bool
- isTouchableOrFmv :: TcLevel -> TcTyVar -> Bool
- isFloatedTouchableMetaTyVar :: TcLevel -> TcTyVar -> Bool
- canUnifyWithPolyType :: DynFlags -> TcTyVarDetails -> TcKind -> Bool
- mkPhiTy :: [PredType] -> Type -> Type
- mkSigmaTy :: [TyVar] -> [PredType] -> Type -> Type
- mkTcEqPred :: TcType -> TcType -> Type
- mkTcReprEqPred :: TcType -> TcType -> Type
- mkTcEqPredRole :: Role -> TcType -> TcType -> 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
- nextRole :: Type -> Role
- tcSplitSigmaTy :: Type -> ([TyVar], ThetaType, Type)
- tcDeepSplitSigmaTy_maybe :: TcSigmaType -> Maybe ([TcType], [TyVar], ThetaType, TcSigmaType)
- eqType :: Type -> Type -> Bool
- eqTypes :: [Type] -> [Type] -> Bool
- eqPred :: PredType -> PredType -> Bool
- cmpType :: Type -> Type -> Ordering
- cmpTypes :: [Type] -> [Type] -> Ordering
- cmpPred :: PredType -> PredType -> Ordering
- eqTypeX :: RnEnv2 -> Type -> Type -> Bool
- pickyEqType :: TcType -> TcType -> Bool
- tcEqType :: TcType -> TcType -> Bool
- tcEqKind :: TcKind -> TcKind -> Bool
- isSigmaTy :: TcType -> Bool
- isRhoTy :: TcType -> Bool
- isOverloadedTy :: Type -> Bool
- isFloatingTy :: Type -> 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
- isPredTy :: Type -> Bool
- isTyVarClassPred :: PredType -> Bool
- isTyVarExposed :: TcTyVar -> TcType -> Bool
- isTyVarUnderDatatype :: TcTyVar -> TcType -> Bool
- deNoteType :: Type -> Type
- occurCheckExpand :: DynFlags -> TcTyVar -> Type -> OccCheckResult Type
- data OccCheckResult a
  - = OC_OK a
  - | OC_Forall
  - | OC_NonTyVar
  - | OC_Occurs
- orphNamesOfType :: Type -> NameSet
- orphNamesOfDFunHead :: Type -> NameSet
- orphNamesOfCo :: Coercion -> NameSet
- orphNamesOfTypes :: [Type] -> NameSet
- orphNamesOfCoCon :: CoAxiom br -> NameSet
- getDFunTyKey :: Type -> OccName
- evVarPred_maybe :: EvVar -> Maybe PredType
- evVarPred :: EvVar -> PredType
- mkMinimalBySCs :: [PredType] -> [PredType]
- transSuperClasses :: Class -> [Type] -> [PredType]
- immSuperClasses :: Class -> [Type] -> [PredType]
- tcTyFamInsts :: Type -> [(TyCon, [Type])]
- exactTyVarsOfType :: Type -> TyVarSet
- exactTyVarsOfTypes :: [Type] -> TyVarSet
- isFFIArgumentTy :: DynFlags -> Safety -> Type -> Validity
- isFFIImportResultTy :: DynFlags -> Type -> Validity
- isFFIExportResultTy :: Type -> Validity
- isFFIExternalTy :: Type -> Validity
- isFFIDynTy :: Type -> Type -> Validity
- isFFIPrimArgumentTy :: DynFlags -> Type -> Validity
- isFFIPrimResultTy :: DynFlags -> Type -> Validity
- isFFILabelTy :: Type -> Validity
- isFFITy :: Type -> Bool
- isFunPtrTy :: Type -> Bool
- tcSplitIOType_maybe :: Type -> Maybe (TyCon, Type)
- type Kind = Type
- typeKind :: Type -> Kind
- unliftedTypeKind :: Kind
- liftedTypeKind :: Kind
- openTypeKind :: Kind
- constraintKind :: Kind
- mkArrowKind :: Kind -> Kind -> Kind
- mkArrowKinds :: [Kind] -> Kind -> Kind
- isLiftedTypeKind :: Kind -> Bool
- isUnliftedTypeKind :: Kind -> Bool
- isSubOpenTypeKind :: Kind -> Bool
- tcIsSubKind :: Kind -> Kind -> Bool
- splitKindFunTys :: Kind -> ([Kind], Kind)
- defaultKind :: Kind -> Kind
- data Type
- type PredType = 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 -> KindOrType -> Type
- applyTys :: Type -> [KindOrType] -> Type
- mkTyVarTy :: TyVar -> Type
- mkTyVarTys :: [TyVar] -> [Type]
- mkTyConTy :: TyCon -> Type
- isClassPred :: PredType -> Bool
- isEqPred :: PredType -> Bool
- isIPPred :: PredType -> Bool
- mkClassPred :: Class -> [Type] -> PredType
- isDictLikeTy :: Type -> Bool
- tcSplitDFunTy :: Type -> ([TyVar], [Type], Class, [Type])
- tcSplitDFunHead :: Type -> (Class, [Type])
- mkEqPred :: Type -> Type -> PredType
- data TvSubst = TvSubst InScopeSet TvSubstEnv
- type TvSubstEnv = TyVarEnv Type
- emptyTvSubst :: TvSubst
- mkOpenTvSubst :: TvSubstEnv -> TvSubst
- zipOpenTvSubst :: [TyVar] -> [Type] -> TvSubst
- zipTopTvSubst :: [TyVar] -> [Type] -> TvSubst
- mkTopTvSubst :: [(TyVar, Type)] -> TvSubst
- notElemTvSubst :: CoVar -> TvSubst -> Bool
- unionTvSubst :: TvSubst -> TvSubst -> TvSubst
- getTvSubstEnv :: TvSubst -> TvSubstEnv
- setTvSubstEnv :: TvSubst -> TvSubstEnv -> TvSubst
- getTvInScope :: TvSubst -> InScopeSet
- extendTvInScope :: TvSubst -> Var -> TvSubst
- lookupTyVar :: TvSubst -> TyVar -> Maybe Type
- extendTvSubst :: TvSubst -> TyVar -> Type -> TvSubst
- substTyVarBndr :: TvSubst -> TyVar -> (TvSubst, TyVar)
- 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]
- isUnLiftedType :: Type -> Bool
- isUnboxedTupleType :: Type -> Bool
- isPrimitiveType :: Type -> Bool
- tyVarsOfType :: Type -> VarSet
- tyVarsOfTypes :: [Type] -> TyVarSet
- closeOverKinds :: TyVarSet -> TyVarSet
- tcTyVarsOfType :: Type -> TcTyVarSet
- tcTyVarsOfTypes :: [Type] -> TyVarSet
- pprKind :: Kind -> SDoc
- pprParendKind :: Kind -> SDoc
- pprSigmaType :: Type -> SDoc
- pprType :: Type -> SDoc
- pprParendType :: Type -> SDoc
- pprTypeApp :: TyCon -> [Type] -> SDoc
- pprTyThingCategory :: TyThing -> SDoc
- pprTheta :: ThetaType -> SDoc
- pprThetaArrowTy :: ThetaType -> SDoc
- pprClassPred :: Class -> [Type] -> SDoc

# Documentation

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 TcCoVar = CoVar

newtype TcLevel

Constructors

TcLevel Int |

Instances

Eq TcLevel |
Outputable TcLevel |

topTcLevel :: TcLevel

pushTcLevel :: TcLevel -> TcLevel

strictlyDeeperThan :: TcLevel -> TcLevel -> Bool

sameDepthAs :: TcLevel -> TcLevel -> Bool

fskTcLevel :: TcLevel

data UserTypeCtxt

Constructors

FunSigCtxt Name |
InfSigCtxt Name |
ExprSigCtxt |
ConArgCtxt Name |
TySynCtxt Name |
PatSigCtxt |
RuleSigCtxt Name |
ResSigCtxt |
ForSigCtxt Name |
DefaultDeclCtxt |
InstDeclCtxt |
SpecInstCtxt |
ThBrackCtxt |
GenSigCtxt |
GhciCtxt |
ClassSCCtxt Name |
SigmaCtxt |
DataTyCtxt Name |

pprUserTypeCtxt :: UserTypeCtxt -> SDoc

pprSigCtxt :: UserTypeCtxt -> SDoc -> SDoc -> SDoc

data TcTyVarDetails

Constructors

SkolemTv Bool |
FlatSkol TcType |
RuntimeUnk |
MetaTv |
Fields mtv_info :: MetaInfo mtv_ref :: IORef MetaDetails mtv_tclvl :: TcLevel

pprTcTyVarDetails :: TcTyVarDetails -> SDoc

vanillaSkolemTv :: TcTyVarDetails

superSkolemTv :: TcTyVarDetails

data MetaDetails

Constructors

Flexi |
Indirect TcType |

Instances

Outputable MetaDetails |

data MetaInfo

Constructors

TauTv Bool |
ReturnTv |
SigTv |
FlatMetaTv |

isImmutableTyVar :: TyVar -> Bool

isSkolemTyVar :: TcTyVar -> Bool

isMetaTyVar :: TcTyVar -> Bool

isMetaTyVarTy :: TcType -> Bool

isTyVarTy :: Type -> Bool

isSigTyVar :: Var -> Bool

isOverlappableTyVar :: TcTyVar -> Bool

isTyConableTyVar :: TcTyVar -> Bool

isFskTyVar :: TcTyVar -> Bool

True of FlatSkol skolems only

isFmvTyVar :: TcTyVar -> Bool

isFlattenTyVar :: TcTyVar -> Bool

True of both given and wanted flatten-skolems (fak and usk)

isReturnTyVar :: TcTyVar -> Bool

isAmbiguousTyVar :: TcTyVar -> Bool

metaTvRef :: TyVar -> IORef MetaDetails

metaTyVarInfo :: TcTyVar -> MetaInfo

isFlexi :: MetaDetails -> Bool

isIndirect :: MetaDetails -> Bool

isRuntimeUnkSkol :: TyVar -> Bool

isTypeVar :: Var -> Bool

isKindVar :: Var -> Bool

metaTyVarTcLevel :: TcTyVar -> TcLevel

setMetaTyVarTcLevel :: TcTyVar -> TcLevel -> TcTyVar

metaTyVarTcLevel_maybe :: TcTyVar -> Maybe TcLevel

isTouchableMetaTyVar :: TcLevel -> TcTyVar -> Bool

isTouchableOrFmv :: TcLevel -> TcTyVar -> Bool

isFloatedTouchableMetaTyVar :: TcLevel -> TcTyVar -> Bool

canUnifyWithPolyType :: DynFlags -> TcTyVarDetails -> TcKind -> Bool

mkPhiTy :: [PredType] -> Type -> Type

mkSigmaTy :: [TyVar] -> [PredType] -> Type -> Type

mkTcEqPred :: TcType -> TcType -> Type

mkTcReprEqPred :: TcType -> TcType -> Type

Make a representational equality predicate

mkTcEqPredRole :: Role -> TcType -> TcType -> Type

Make an equality predicate at a given role. The role must not be Phantom.

tcView :: Type -> Maybe Type

Similar to `coreView`, but for the type checker, which just looks through synonyms

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)

Does the AppTy split as in `splitAppTy_maybe`, but assumes that any Core view stuff is already done

tcInstHeadTyNotSynonym :: Type -> Bool

tcInstHeadTyAppAllTyVars :: Type -> Bool

tcGetTyVar_maybe :: Type -> Maybe TyVar

tcGetTyVar :: String -> Type -> TyVar

nextRole :: Type -> Role

What is the role assigned to the next parameter of this type? Usually, this will be `Nominal`, but if the type is a `TyConApp`, we may be able to do better. The type does *not* have to be well-kinded when applied for this to work!

tcSplitSigmaTy :: Type -> ([TyVar], ThetaType, Type)

tcDeepSplitSigmaTy_maybe :: TcSigmaType -> Maybe ([TcType], [TyVar], ThetaType, TcSigmaType)

eqType :: Type -> Type -> Bool

Type equality on source types. Does not look through `newtypes` or `PredType`s, but it does look through type synonyms. Watch out for horrible hack: See Note [Comparison with OpenTypeKind]

eqTypes :: [Type] -> [Type] -> Bool

eqPred :: PredType -> PredType -> Bool

cmpType :: Type -> Type -> Ordering

cmpTypes :: [Type] -> [Type] -> Ordering

cmpPred :: PredType -> PredType -> Ordering

eqTypeX :: RnEnv2 -> Type -> Type -> Bool

pickyEqType :: TcType -> TcType -> Bool

tcEqType :: TcType -> TcType -> Bool

tcEqKind :: TcKind -> TcKind -> Bool

isSigmaTy :: TcType -> Bool

isRhoTy :: TcType -> Bool

isOverloadedTy :: Type -> Bool

isFloatingTy :: Type -> Bool

Does a type represent a floating-point number?

isDoubleTy :: Type -> Bool

isFloatTy :: Type -> Bool

isIntTy :: Type -> Bool

isWordTy :: Type -> Bool

isStringTy :: Type -> Bool

Is a type `String`?

isIntegerTy :: Type -> Bool

isBoolTy :: Type -> Bool

isUnitTy :: Type -> Bool

isCharTy :: Type -> Bool

isTauTy :: Type -> Bool

isTauTyCon :: TyCon -> Bool

tcIsTyVarTy :: Type -> Bool

tcIsForAllTy :: Type -> Bool

isPredTy :: Type -> Bool

isTyVarClassPred :: PredType -> Bool

isTyVarExposed :: TcTyVar -> TcType -> Bool

Does the given tyvar appear in the given type outside of any non-newtypes? Assume we're looking for `a`. Says "yes" for `a`, `N a`, `b a`, `a b`, `b (N a)`. Says "no" for `[a]`, `Maybe a`, `T a`, where `N` is a newtype and `T` is a datatype.

isTyVarUnderDatatype :: TcTyVar -> TcType -> Bool

Does the given tyvar appear under a type generative w.r.t. representational equality? See Note [Occurs check error] in TcCanonical for the motivation for this function.

deNoteType :: Type -> Type

occurCheckExpand :: DynFlags -> TcTyVar -> Type -> OccCheckResult Type

data OccCheckResult a

Constructors

OC_OK a |
OC_Forall |
OC_NonTyVar |
OC_Occurs |

Instances

Monad OccCheckResult |
Functor OccCheckResult |
Applicative OccCheckResult |

orphNamesOfType :: Type -> NameSet

orphNamesOfDFunHead :: Type -> NameSet

orphNamesOfCo :: Coercion -> NameSet

orphNamesOfTypes :: [Type] -> NameSet

orphNamesOfCoCon :: CoAxiom br -> NameSet

getDFunTyKey :: Type -> OccName

evVarPred_maybe :: EvVar -> Maybe PredType

evVarPred :: EvVar -> PredType

mkMinimalBySCs :: [PredType] -> [PredType]

transSuperClasses :: Class -> [Type] -> [PredType]

immSuperClasses :: Class -> [Type] -> [PredType]

# Finding type instances

tcTyFamInsts :: Type -> [(TyCon, [Type])]

Finds outermost type-family applications occuring in a type, after expanding synonyms.

# Finding "exact" (non-dead) type variables

exactTyVarsOfType :: Type -> TyVarSet

exactTyVarsOfTypes :: [Type] -> TyVarSet

isFFIArgumentTy :: DynFlags -> Safety -> Type -> Validity

isFFIImportResultTy :: DynFlags -> Type -> Validity

isFFIExportResultTy :: Type -> Validity

isFFIExternalTy :: Type -> Validity

isFFIDynTy :: Type -> Type -> Validity

isFFIPrimArgumentTy :: DynFlags -> Type -> Validity

isFFIPrimResultTy :: DynFlags -> Type -> Validity

isFFILabelTy :: Type -> Validity

isFFITy :: Type -> Bool

isFunPtrTy :: Type -> Bool

tcSplitIOType_maybe :: Type -> Maybe (TyCon, Type)

type Kind = Type

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)

typeKind :: Type -> Kind

unliftedTypeKind :: Kind

See Type for details of the distinction between these `Kind`s

liftedTypeKind :: Kind

See Type for details of the distinction between these `Kind`s

openTypeKind :: Kind

See Type for details of the distinction between these `Kind`s

constraintKind :: Kind

See Type for details of the distinction between these `Kind`s

mkArrowKind :: Kind -> Kind -> Kind

Given two kinds `k1` and `k2`, creates the `Kind` `k1 -> k2`

mkArrowKinds :: [Kind] -> Kind -> Kind

Iterated application of `mkArrowKind`

isLiftedTypeKind :: Kind -> Bool

isUnliftedTypeKind :: Kind -> Bool

See Type for details of the distinction between these `Kind`s

isSubOpenTypeKind :: Kind -> Bool

True of any sub-kind of OpenTypeKind

tcIsSubKind :: Kind -> Kind -> Bool

splitKindFunTys :: Kind -> ([Kind], Kind)

Essentially `splitFunTys` on kinds

defaultKind :: Kind -> Kind

data Type

The key representation of types within the compiler

Instances

Data Type |
Outputable Type |

type PredType = Type

A type of the form `p` of kind `Constraint` represents a value whose type is the Haskell predicate `p`, where a predicate is what occurs before the `=>` in a Haskell type.

We use `PredType` as documentation to mark those types that we guarantee to have this kind.

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"

type ThetaType = [PredType]

A collection of `PredType`s

mkForAllTy :: TyVar -> Type -> Type

mkForAllTys :: [TyVar] -> Type -> Type

Wraps foralls over the type using the provided `TyVar`s from left to right

mkFunTy :: Type -> Type -> Type infixr 3

Creates a function type from the given argument and result type

mkFunTys :: [Type] -> Type -> Type

zipFunTys :: Outputable a => [a] -> Type -> ([(a, Type)], 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.

mkTyConApp :: TyCon -> [Type] -> Type

A key function: builds a `TyConApp` or `FunTy` as appropriate to its arguments. Applies its arguments to the constructor from left to right.

mkAppTy :: Type -> Type -> Type

Applies a type to another, as in e.g. `k a`

mkAppTys :: Type -> [Type] -> Type

applyTy :: Type -> KindOrType -> Type

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.

applyTys :: Type -> [KindOrType] -> Type

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, but only (I think) in situations involving undefined. For example: undefined :: forall a. a Term: undefined `(forall b. b->b)` Int This term should have type (Int -> Int), but notice that there are more type args than foralls in `undefined`s type.

mkTyVarTy :: TyVar -> Type

mkTyVarTys :: [TyVar] -> [Type]

mkTyConTy :: TyCon -> Type

Create the plain type constructor type which has been applied to no type arguments at all.

isClassPred :: PredType -> Bool

isEqPred :: PredType -> Bool

isIPPred :: PredType -> Bool

mkClassPred :: Class -> [Type] -> PredType

isDictLikeTy :: Type -> Bool

tcSplitDFunTy :: Type -> ([TyVar], [Type], Class, [Type])

tcSplitDFunHead :: Type -> (Class, [Type])

mkEqPred :: Type -> Type -> PredType

Creates a type equality predicate

data TvSubst

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 substitution is only applied ONCE! This is because in general such application will not reached a fixed point.

Constructors

TvSubst InScopeSet TvSubstEnv |

type TvSubstEnv = TyVarEnv Type

A substitution of `Type`s for `TyVar`s and `Kind`s for `KindVar`s

emptyTvSubst :: TvSubst

mkOpenTvSubst :: TvSubstEnv -> TvSubst

Generates the in-scope set for the `TvSubst` from the types in the incoming environment, hence "open"

zipOpenTvSubst :: [TyVar] -> [Type] -> TvSubst

Generates the in-scope set for the `TvSubst` from the types in the incoming environment, hence "open"

zipTopTvSubst :: [TyVar] -> [Type] -> TvSubst

mkTopTvSubst :: [(TyVar, Type)] -> TvSubst

Called when doing top-level substitutions. Here we expect that the free vars of the range of the substitution will be empty.

notElemTvSubst :: CoVar -> TvSubst -> Bool

unionTvSubst :: TvSubst -> TvSubst -> TvSubst

getTvSubstEnv :: TvSubst -> TvSubstEnv

setTvSubstEnv :: TvSubst -> TvSubstEnv -> TvSubst

getTvInScope :: TvSubst -> InScopeSet

extendTvInScope :: TvSubst -> Var -> TvSubst

lookupTyVar :: TvSubst -> TyVar -> Maybe Type

extendTvSubst :: TvSubst -> TyVar -> Type -> TvSubst

substTyVarBndr :: TvSubst -> TyVar -> (TvSubst, TyVar)

extendTvSubstList :: TvSubst -> [TyVar] -> [Type] -> TvSubst

isInScope :: Var -> TvSubst -> Bool

mkTvSubst :: InScopeSet -> TvSubstEnv -> TvSubst

zipTyEnv :: [TyVar] -> [Type] -> TvSubstEnv

substTy :: TvSubst -> Type -> Type

Substitute within a `Type`

substTys :: TvSubst -> [Type] -> [Type]

Substitute within several `Type`s

substTyWith :: [TyVar] -> [Type] -> Type -> Type

Type substitution making use of an `TvSubst` that is assumed to be open, see `zipOpenTvSubst`

substTheta :: TvSubst -> ThetaType -> ThetaType

Substitute within a `ThetaType`

substTyVar :: TvSubst -> TyVar -> Type

substTyVars :: TvSubst -> [TyVar] -> [Type]

isUnLiftedType :: Type -> Bool

See Type for what an unlifted type is

isUnboxedTupleType :: Type -> Bool

isPrimitiveType :: Type -> Bool

Returns true of types that are opaque to Haskell.

tyVarsOfType :: Type -> VarSet

NB: for type synonyms tyVarsOfType does not expand the synonym tyVarsOfType returns only the free variables of a type For example, tyVarsOfType (a::k) returns {a}, not including the kind variable {k}

tyVarsOfTypes :: [Type] -> TyVarSet

closeOverKinds :: TyVarSet -> TyVarSet

tcTyVarsOfType :: Type -> TcTyVarSet

tcTyVarsOfTypes :: [Type] -> TyVarSet

pprKind :: Kind -> SDoc

pprParendKind :: Kind -> SDoc

pprSigmaType :: Type -> SDoc

pprType :: Type -> SDoc

pprParendType :: Type -> SDoc

pprTypeApp :: TyCon -> [Type] -> SDoc

pprTyThingCategory :: TyThing -> SDoc

pprTheta :: ThetaType -> SDoc

pprThetaArrowTy :: ThetaType -> SDoc

pprClassPred :: Class -> [Type] -> SDoc