TcType

ghc-8.0.1: The GHC API

Safe Haskell | None
Language | Haskell2010

TcType

Contents

- Finding type instances
- Finding "exact" (non-dead) type variables
- Extracting bound 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 TcDTyVarSet = DTyVarSet
- type TcTyCoVarSet = TyCoVarSet
- type TcDTyCoVarSet = DTyCoVarSet
- type TcKind = Kind
- type TcCoVar = CoVar
- type TcTyCoVar = Var
- type TcTyBinder = TyBinder
- type TcTyCon = TyCon
- data ExpType
  - = Check TcType
  - | Infer Unique TcLevel Kind (IORef (Maybe TcType))
- type ExpSigmaType = ExpType
- type ExpRhoType = ExpType
- mkCheckExpType :: TcType -> ExpType
- data SyntaxOpType
  - = SynAny
  - | SynRho
  - | SynList
  - | SynFun SyntaxOpType SyntaxOpType
  - | SynType ExpType
- synKnownType :: TcType -> SyntaxOpType
- mkSynFunTys :: [SyntaxOpType] -> ExpType -> SyntaxOpType
- newtype TcLevel = TcLevel Int
- topTcLevel :: TcLevel
- pushTcLevel :: TcLevel -> TcLevel
- isTopTcLevel :: TcLevel -> Bool
- strictlyDeeperThan :: TcLevel -> TcLevel -> Bool
- sameDepthAs :: TcLevel -> TcLevel -> Bool
- fmvTcLevel :: TcLevel -> TcLevel
- data UserTypeCtxt
  - = FunSigCtxt Name Bool
  - | InfSigCtxt Name
  - | ExprSigCtxt
  - | TypeAppCtxt
  - | ConArgCtxt Name
  - | TySynCtxt Name
  - | PatSynBuilderCtxt 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
- isSigMaybe :: UserTypeCtxt -> Maybe Name
- 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
  - | SigTv
  - | FlatMetaTv
- data TauTvFlavour
  - = VanillaTau
  - | WildcardTau
- 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
- isAmbiguousTyVar :: TcTyVar -> Bool
- metaTvRef :: TyVar -> IORef MetaDetails
- metaTyVarInfo :: TcTyVar -> MetaInfo
- isFlexi :: MetaDetails -> Bool
- isIndirect :: MetaDetails -> Bool
- isRuntimeUnkSkol :: TyVar -> 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 -> Bool
- mkPhiTy :: [PredType] -> Type -> Type
- mkInvSigmaTy :: [TyVar] -> [PredType] -> Type -> Type
- mkSpecSigmaTy :: [TyVar] -> [PredType] -> Type -> Type
- mkSigmaTy :: [TyBinder] -> [PredType] -> Type -> Type
- mkNakedTyConApp :: TyCon -> [Type] -> Type
- mkNakedAppTys :: Type -> [Type] -> Type
- mkNakedAppTy :: Type -> Type -> Type
- mkNakedCastTy :: Type -> Coercion -> Type
- getTyVar :: String -> Type -> TyVar
- tcSplitForAllTy_maybe :: Type -> Maybe (TyBinder, Type)
- tcSplitForAllTys :: Type -> ([TyVar], Type)
- tcSplitPiTys :: Type -> ([TyBinder], Type)
- tcSplitNamedPiTys :: Type -> ([TyBinder], 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])
- tcRepSplitTyConApp_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])
- tcRepSplitAppTy_maybe :: Type -> Maybe (Type, Type)
- 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
- cmpType :: Type -> Type -> Ordering
- cmpTypes :: [Type] -> [Type] -> Ordering
- eqTypeX :: RnEnv2 -> Type -> Type -> Bool
- pickyEqType :: TcType -> TcType -> Bool
- tcEqType :: TcType -> TcType -> Bool
- tcEqKind :: TcKind -> TcKind -> Bool
- tcEqTypeNoKindCheck :: TcType -> TcType -> Bool
- tcEqTypeVis :: TcType -> TcType -> Maybe VisibilityFlag
- isSigmaTy :: TcType -> Bool
- isRhoTy :: TcType -> Bool
- isRhoExpTy :: ExpType -> 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
- isCallStackTy :: Type -> Bool
- isCallStackPred :: PredType -> Maybe FastString
- 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
- checkValidClsArgs :: Bool -> Class -> [KindOrType] -> Bool
- hasTyVarHead :: Type -> Bool
- isRigidEqPred :: TcLevel -> PredTree -> Bool
- isRigidTy :: 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
- 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 :: PredType -> [PredType]
- pickQuantifiablePreds :: TyVarSet -> TcThetaType -> TcThetaType -> TcThetaType
- immSuperClasses :: Class -> [Type] -> [PredType]
- isImprovementPred :: PredType -> Bool
- tcTyFamInsts :: Type -> [(TyCon, [Type])]
- exactTyCoVarsOfType :: Type -> TyCoVarSet
- exactTyCoVarsOfTypes :: [Type] -> TyVarSet
- allBoundVariables :: Type -> TyVarSet
- allBoundVariabless :: [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
- liftedTypeKind :: Kind
- constraintKind :: Kind
- isLiftedTypeKind :: Kind -> Bool
- isUnliftedTypeKind :: Kind -> Bool
- classifiesTypeWithValues :: Kind -> Bool
- data Type
- type PredType = Type
- type ThetaType = [PredType]
- data TyBinder
- data VisibilityFlag
  - = Visible
  - | Specified
  - | Invisible
- mkForAllTy :: TyBinder -> Type -> Type
- mkForAllTys :: [TyBinder] -> Type -> Type
- mkInvForAllTys :: [TyVar] -> Type -> Type
- mkSpecForAllTys :: [TyVar] -> Type -> Type
- mkNamedForAllTy :: TyVar -> VisibilityFlag -> Type -> Type
- mkFunTy :: Type -> Type -> Type
- mkFunTys :: [Type] -> Type -> Type
- mkTyConApp :: TyCon -> [Type] -> Type
- mkAppTy :: Type -> Type -> Type
- mkAppTys :: Type -> [Type] -> Type
- mkTyConTy :: TyCon -> Type
- mkTyVarTy :: TyVar -> Type
- mkTyVarTys :: [TyVar] -> [Type]
- mkNamedBinder :: VisibilityFlag -> Var -> TyBinder
- isClassPred :: PredType -> Bool
- isEqPred :: PredType -> Bool
- isNomEqPred :: PredType -> Bool
- isIPPred :: PredType -> Bool
- mkClassPred :: Class -> [Type] -> PredType
- isDictLikeTy :: Type -> Bool
- tcSplitDFunTy :: Type -> ([TyVar], [Type], Class, [Type])
- tcSplitDFunHead :: Type -> (Class, [Type])
- isRuntimeRepVar :: TyVar -> Bool
- isRuntimeRepPolymorphic :: Kind -> Bool
- isVisibleBinder :: TyBinder -> Bool
- isInvisibleBinder :: TyBinder -> Bool
- data TCvSubst = TCvSubst InScopeSet TvSubstEnv CvSubstEnv
- type TvSubstEnv = TyVarEnv Type
- emptyTCvSubst :: TCvSubst
- zipTvSubst :: [TyVar] -> [Type] -> TCvSubst
- mkTvSubstPrs :: [(TyVar, Type)] -> TCvSubst
- notElemTCvSubst :: Var -> TCvSubst -> Bool
- unionTCvSubst :: TCvSubst -> TCvSubst -> TCvSubst
- getTvSubstEnv :: TCvSubst -> TvSubstEnv
- setTvSubstEnv :: TCvSubst -> TvSubstEnv -> TCvSubst
- getTCvInScope :: TCvSubst -> InScopeSet
- extendTCvInScope :: TCvSubst -> Var -> TCvSubst
- extendTCvInScopeList :: TCvSubst -> [Var] -> TCvSubst
- extendTCvInScopeSet :: TCvSubst -> VarSet -> TCvSubst
- extendTvSubstAndInScope :: TCvSubst -> TyVar -> Type -> TCvSubst
- lookupTyVar :: TCvSubst -> TyVar -> Maybe Type
- extendTCvSubst :: TCvSubst -> TyCoVar -> Type -> TCvSubst
- substTyVarBndr :: (?callStack :: CallStack) => TCvSubst -> TyVar -> (TCvSubst, TyVar)
- extendTvSubst :: TCvSubst -> TyVar -> Type -> TCvSubst
- isInScope :: Var -> TCvSubst -> Bool
- mkTCvSubst :: InScopeSet -> (TvSubstEnv, CvSubstEnv) -> TCvSubst
- mkTvSubst :: InScopeSet -> TvSubstEnv -> TCvSubst
- zipTyEnv :: [TyVar] -> [Type] -> TvSubstEnv
- zipCoEnv :: [CoVar] -> [Coercion] -> CvSubstEnv
- substTy :: (?callStack :: CallStack) => TCvSubst -> Type -> Type
- substTys :: (?callStack :: CallStack) => TCvSubst -> [Type] -> [Type]
- substTyWith :: (?callStack :: CallStack) => [TyVar] -> [Type] -> Type -> Type
- substTyWithCoVars :: [CoVar] -> [Coercion] -> Type -> Type
- substTyAddInScope :: TCvSubst -> Type -> Type
- substTyUnchecked :: TCvSubst -> Type -> Type
- substTysUnchecked :: TCvSubst -> [Type] -> [Type]
- substThetaUnchecked :: TCvSubst -> ThetaType -> ThetaType
- substTyWithBindersUnchecked :: [TyBinder] -> [Type] -> Type -> Type
- substTyWithUnchecked :: [TyVar] -> [Type] -> Type -> Type
- substCoUnchecked :: TCvSubst -> Coercion -> Coercion
- substCoWithUnchecked :: [TyVar] -> [Type] -> Coercion -> Coercion
- substTheta :: (?callStack :: CallStack) => TCvSubst -> ThetaType -> ThetaType
- isUnliftedType :: Type -> Bool
- isUnboxedTupleType :: Type -> Bool
- isPrimitiveType :: Type -> Bool
- coreView :: Type -> Maybe Type
- tyCoVarsOfType :: Type -> TyCoVarSet
- tyCoVarsOfTypes :: [Type] -> TyCoVarSet
- closeOverKinds :: TyVarSet -> TyVarSet
- tyCoVarsOfTelescope :: [Var] -> TyCoVarSet -> TyCoVarSet
- tyCoVarsOfTypeAcc :: Type -> FV
- tyCoVarsOfTypesAcc :: [Type] -> FV
- tyCoVarsOfTypeDSet :: Type -> DTyCoVarSet
- tyCoVarsOfTypesDSet :: [Type] -> DTyCoVarSet
- closeOverKindsDSet :: DTyVarSet -> DTyVarSet
- tyCoVarsOfTypeList :: Type -> [TyCoVar]
- tyCoVarsOfTypesList :: [Type] -> [TyCoVar]
- toTcType :: Type -> TcType
- toTcTypeBag :: Bag EvVar -> Bag EvVar
- 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
- pprTvBndr :: TyVar -> SDoc
- pprTvBndrs :: [TyVar] -> SDoc
- type TypeSize = IntWithInf
- sizeType :: Type -> TypeSize
- sizeTypes :: [Type] -> TypeSize
- toposortTyVars :: [TyVar] -> [TyVar]

# 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 TcDTyVarSet = DTyVarSet #

type TcTyCoVarSet = TyCoVarSet #

type TcDTyCoVarSet = DTyCoVarSet #

type TcKind = Kind #

type TcCoVar = CoVar #

type TcTyCoVar = Var #

type TcTyBinder = TyBinder #

type TcTyCon = TyCon #

data ExpType #

An expected type to check against during type-checking. See Note [ExpType] in TcMType, where you'll also find manipulators.

Constructors

Check TcType |
Infer Unique TcLevel Kind (IORef (Maybe TcType)) |

Instances

Outputable ExpType # |
Methods ppr :: ExpType -> SDoc # pprPrec :: Rational -> ExpType -> SDoc #

type ExpSigmaType = ExpType #

type ExpRhoType = ExpType #

mkCheckExpType :: TcType -> ExpType #

Make an `ExpType` suitable for checking.

data SyntaxOpType #

What to expect for an argument to a rebindable-syntax operator. Quite like `Type`, but allows for holes to be filled in by tcSyntaxOp. The callback called from tcSyntaxOp gets a list of types; the meaning of these types is determined by a left-to-right depth-first traversal of the `SyntaxOpType` tree. So if you pass in

    SynAny `SynFun` (SynList `SynFun` SynType Int) `SynFun` SynAny

you'll get three types back: one for the first `SynAny`, the element type of the list, and one for the last `SynAny`. You don't get anything for the `SynType`, because you've said positively that it should be an Int, and so it shall be.

This is defined here to avoid defining it in TcExpr.hs-boot.

Constructors

SynAny | Any type
SynRho | A rho type, deeply skolemised or instantiated as appropriate
SynList | A list type. You get back the element type of the list
SynFun SyntaxOpType SyntaxOpType infixr 0 | A function.
SynType ExpType | A known type.

synKnownType :: TcType -> SyntaxOpType #

Like `SynType` but accepts a regular TcType

mkSynFunTys :: [SyntaxOpType] -> ExpType -> SyntaxOpType #

Like `mkFunTys` but for `SyntaxOpType`

newtype TcLevel #

Constructors

TcLevel Int |

Instances

Eq TcLevel # |
Methods (==) :: TcLevel -> TcLevel -> Bool # (/=) :: TcLevel -> TcLevel -> Bool #
Ord TcLevel # |
Methods compare :: TcLevel -> TcLevel -> Ordering # (<) :: TcLevel -> TcLevel -> Bool # (<=) :: TcLevel -> TcLevel -> Bool # (>) :: TcLevel -> TcLevel -> Bool # (>=) :: TcLevel -> TcLevel -> Bool # max :: TcLevel -> TcLevel -> TcLevel # min :: TcLevel -> TcLevel -> TcLevel #
Outputable TcLevel # |
Methods ppr :: TcLevel -> SDoc # pprPrec :: Rational -> TcLevel -> SDoc #

topTcLevel :: TcLevel #

pushTcLevel :: TcLevel -> TcLevel #

isTopTcLevel :: TcLevel -> Bool #

strictlyDeeperThan :: TcLevel -> TcLevel -> Bool #

sameDepthAs :: TcLevel -> TcLevel -> Bool #

fmvTcLevel :: TcLevel -> TcLevel #

data UserTypeCtxt #

Constructors

FunSigCtxt Name Bool |
InfSigCtxt Name |
ExprSigCtxt |
TypeAppCtxt |
ConArgCtxt Name |
TySynCtxt Name |
PatSynBuilderCtxt 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 #

isSigMaybe :: UserTypeCtxt -> Maybe Name #

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 # |
Methods ppr :: MetaDetails -> SDoc # pprPrec :: Rational -> MetaDetails -> SDoc #

data MetaInfo #

Constructors

TauTv |
SigTv |
FlatMetaTv |

data TauTvFlavour #

Constructors

VanillaTau |
WildcardTau | A tyvar that originates from a type wildcard.

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)

isAmbiguousTyVar :: TcTyVar -> Bool #

metaTvRef :: TyVar -> IORef MetaDetails #

metaTyVarInfo :: TcTyVar -> MetaInfo #

isFlexi :: MetaDetails -> Bool #

isIndirect :: MetaDetails -> Bool #

isRuntimeUnkSkol :: TyVar -> 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 -> Bool #

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

mkInvSigmaTy :: [TyVar] -> [PredType] -> Type -> Type #

mkSpecSigmaTy :: [TyVar] -> [PredType] -> Type -> Type #

Make a sigma ty where all type variables are "specified". That is, they can be used with visible type application

mkSigmaTy :: [TyBinder] -> [PredType] -> Type -> Type #

mkNakedTyConApp :: TyCon -> [Type] -> Type #

mkNakedAppTys :: Type -> [Type] -> Type #

mkNakedAppTy :: Type -> Type -> Type #

mkNakedCastTy :: Type -> Coercion -> Type #

getTyVar :: String -> Type -> TyVar #

Attempts to obtain the type variable underlying a `Type`, and panics with the given message if this is not a type variable type. See also `getTyVar_maybe`

tcSplitForAllTy_maybe :: Type -> Maybe (TyBinder, Type) #

tcSplitForAllTys :: Type -> ([TyVar], Type) #

Like `tcSplitPiTys`, but splits off only named binders, returning just the tycovars.

tcSplitPiTys :: Type -> ([TyBinder], Type) #

Splits a forall type into a list of `TyBinder`s and the inner type. Always succeeds, even if it returns an empty list.

tcSplitNamedPiTys :: Type -> ([TyBinder], Type) #

Like `tcSplitForAllTys`, but splits off only named binders.

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]) #

tcRepSplitTyConApp_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]) #

tcRepSplitAppTy_maybe :: Type -> Maybe (Type, Type) #

Does the AppTy split as in `tcSplitAppTy_maybe`, but assumes that any coreView stuff is already done. Refuses to look through (c => t)

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) #

Split a sigma type into its parts.

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. This first checks that the kinds of the types are equal and then checks whether the types are equal, ignoring casts and coercions. (The kind check is a recursive call, but since all kinds have type `Type`, there is no need to check the types of kinds.) See also Note [Non-trivial definitional equality] in TyCoRep.

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

Type equality on lists of types, looking through type synonyms but not newtypes.

cmpType :: Type -> Type -> Ordering #

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

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

Compare types with respect to a (presumably) non-empty `RnEnv2`.

pickyEqType :: TcType -> TcType -> Bool #

Like `pickyEqTypeVis`, but returns a Bool for convenience

tcEqType :: TcType -> TcType -> Bool #

tcEqKind :: TcKind -> TcKind -> Bool #

tcEqTypeNoKindCheck :: TcType -> TcType -> Bool #

Just like `tcEqType`, but will return True for types of different kinds as long as their non-coercion structure is identical.

tcEqTypeVis :: TcType -> TcType -> Maybe VisibilityFlag #

Like `tcEqType`, but returns information about whether the difference is visible in the case of a mismatch. A return of Nothing means the types are `tcEqType`.

isSigmaTy :: TcType -> Bool #

isRhoTy :: TcType -> Bool #

isRhoExpTy :: ExpType -> Bool #

Like `isRhoTy`, but also says `True` for `Infer` types

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 #

isCallStackTy :: Type -> Bool #

Is a type a `CallStack`?

isCallStackPred :: PredType -> Maybe FastString #

Is a `PredType` a `CallStack` implicit parameter?

If so, return the name of the parameter.

isTauTy :: Type -> Bool #

isTauTyCon :: TyCon -> Bool #

tcIsTyVarTy :: Type -> Bool #

tcIsForAllTy :: Type -> Bool #

Is this a ForAllTy with a named binder?

isPredTy :: Type -> Bool #

Is the type suitable to classify a given/wanted in the typechecker?

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.

checkValidClsArgs :: Bool -> Class -> [KindOrType] -> Bool #

hasTyVarHead :: Type -> Bool #

isRigidEqPred :: TcLevel -> PredTree -> Bool #

True of all Nominal equalities that are solidly insoluble This means all equalities *except* * Meta-tv non-SigTv on LHS * Meta-tv SigTv on LHS, tyvar on right

isRigidTy :: TcType -> Bool #

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 # |
Methods (>>=) :: OccCheckResult a -> (a -> OccCheckResult b) -> OccCheckResult b Source # (>>) :: OccCheckResult a -> OccCheckResult b -> OccCheckResult b Source # return :: a -> OccCheckResult a Source # fail :: String -> OccCheckResult a Source #
Functor OccCheckResult # |
Methods fmap :: (a -> b) -> OccCheckResult a -> OccCheckResult b Source # (<$) :: a -> OccCheckResult b -> OccCheckResult a Source #
Applicative OccCheckResult # |
Methods pure :: a -> OccCheckResult a Source # (<*>) :: OccCheckResult (a -> b) -> OccCheckResult a -> OccCheckResult b Source # (*>) :: OccCheckResult a -> OccCheckResult b -> OccCheckResult b Source # (<*) :: OccCheckResult a -> OccCheckResult b -> OccCheckResult a Source #

orphNamesOfType :: 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 :: PredType -> [PredType] #

pickQuantifiablePreds :: TyVarSet -> TcThetaType -> TcThetaType -> TcThetaType #

When inferring types, should we quantify over a given predicate? Generally true of classes; generally false of equality constraints. Equality constraints that mention quantified type variables and implicit variables complicate the story. See Notes [Inheriting implicit parameters] and [Quantifying over equality constraints]

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

isImprovementPred :: PredType -> Bool #

# 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

exactTyCoVarsOfType :: Type -> TyCoVarSet #

exactTyCoVarsOfTypes :: [Type] -> TyVarSet #

# Extracting bound variables

allBoundVariables :: Type -> TyVarSet #

Find all variables bound anywhere in a type. See also Note [Scope-check inferred kinds] in TcHsType

allBoundVariabless :: [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.

typeKind :: Type -> Kind #

liftedTypeKind :: Kind #

constraintKind :: Kind #

isLiftedTypeKind :: Kind -> Bool #

This version considers Constraint to be distinct from *.

isUnliftedTypeKind :: Kind -> Bool #

classifiesTypeWithValues :: Kind -> Bool #

Does this classify a type allowed to have values? Responds True to things like *, #, TYPE Lifted, TYPE v, Constraint.

True of any sub-kind of OpenTypeKind

data Type #

The key representation of types within the compiler

Instances

Data Type # |
Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Type -> c Type Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Type Source # toConstr :: Type -> Constr Source # dataTypeOf :: Type -> DataType Source # dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c Type) Source # dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Type) Source # gmapT :: (forall b. Data b => b -> b) -> Type -> Type Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Type -> r Source # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Type -> r Source # gmapQ :: (forall d. Data d => d -> u) -> Type -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> Type -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Type -> m Type Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Type -> m Type Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Type -> m Type Source #
Outputable Type # |
Methods ppr :: Type -> SDoc # pprPrec :: Rational -> Type -> SDoc #

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

data TyBinder #

A `TyBinder` represents an argument to a function. TyBinders can be dependent (`Named`) or nondependent (`Anon`). They may also be visible or not. See also Note [TyBinder]

Instances

Data TyBinder # |
Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> TyBinder -> c TyBinder Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c TyBinder Source # toConstr :: TyBinder -> Constr Source # dataTypeOf :: TyBinder -> DataType Source # dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c TyBinder) Source # dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c TyBinder) Source # gmapT :: (forall b. Data b => b -> b) -> TyBinder -> TyBinder Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> TyBinder -> r Source # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> TyBinder -> r Source # gmapQ :: (forall d. Data d => d -> u) -> TyBinder -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> TyBinder -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> TyBinder -> m TyBinder Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> TyBinder -> m TyBinder Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> TyBinder -> m TyBinder Source #
Outputable TyBinder # |
Methods ppr :: TyBinder -> SDoc # pprPrec :: Rational -> TyBinder -> SDoc #

data VisibilityFlag #

Is something required to appear in source Haskell (`Visible`), permitted by request (`Specified`) (visible type application), or prohibited entirely from appearing in source Haskell (`Invisible`)? Examples in Note [VisibilityFlag]

Constructors

Visible |
Specified |
Invisible |

Instances

Eq VisibilityFlag # |
Methods (==) :: VisibilityFlag -> VisibilityFlag -> Bool # (/=) :: VisibilityFlag -> VisibilityFlag -> Bool #
Data VisibilityFlag # |
Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> VisibilityFlag -> c VisibilityFlag Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c VisibilityFlag Source # toConstr :: VisibilityFlag -> Constr Source # dataTypeOf :: VisibilityFlag -> DataType Source # dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c VisibilityFlag) Source # dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c VisibilityFlag) Source # gmapT :: (forall b. Data b => b -> b) -> VisibilityFlag -> VisibilityFlag Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> VisibilityFlag -> r Source # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> VisibilityFlag -> r Source # gmapQ :: (forall d. Data d => d -> u) -> VisibilityFlag -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> VisibilityFlag -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> VisibilityFlag -> m VisibilityFlag Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> VisibilityFlag -> m VisibilityFlag Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> VisibilityFlag -> m VisibilityFlag Source #
Outputable VisibilityFlag # |
Methods ppr :: VisibilityFlag -> SDoc # pprPrec :: Rational -> VisibilityFlag -> SDoc #
Binary VisibilityFlag # |
Methods put_ :: BinHandle -> VisibilityFlag -> IO () # put :: BinHandle -> VisibilityFlag -> IO (Bin VisibilityFlag) # get :: BinHandle -> IO VisibilityFlag #

mkForAllTy :: TyBinder -> Type -> Type #

mkForAllTys :: [TyBinder] -> Type -> Type #

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

mkInvForAllTys :: [TyVar] -> Type -> Type #

Like mkForAllTys, but assumes all variables are dependent and invisible, a common case

mkSpecForAllTys :: [TyVar] -> Type -> Type #

Like mkForAllTys, but assumes all variables are dependent and specified, a common case

mkNamedForAllTy :: TyVar -> VisibilityFlag -> Type -> Type #

Make a dependent forall.

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

Make an arrow type

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

Make nested arrow types

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 #

mkTyConTy :: TyCon -> Type #

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

mkTyVarTy :: TyVar -> Type #

mkTyVarTys :: [TyVar] -> [Type] #

mkNamedBinder :: VisibilityFlag -> Var -> TyBinder #

Make a named binder

isClassPred :: PredType -> Bool #

isEqPred :: PredType -> Bool #

isNomEqPred :: PredType -> Bool #

isIPPred :: PredType -> Bool #

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

isDictLikeTy :: Type -> Bool #

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

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

isRuntimeRepVar :: TyVar -> Bool #

Is a tyvar of type `RuntimeRep`?

isRuntimeRepPolymorphic :: Kind -> Bool #

Tests whether the given type (which should look like "TYPE ...") has any free variables

isVisibleBinder :: TyBinder -> Bool #

Does this binder bind a visible argument?

isInvisibleBinder :: TyBinder -> Bool #

Does this binder bind an invisible argument?

data TCvSubst #

Type & coercion substitution

The following invariants must hold of a `TCvSubst`:

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 reach a fixed point.

Constructors

TCvSubst InScopeSet TvSubstEnv CvSubstEnv |

Instances

Outputable TCvSubst # |
Methods ppr :: TCvSubst -> SDoc # pprPrec :: Rational -> TCvSubst -> SDoc #

type TvSubstEnv = TyVarEnv Type #

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

emptyTCvSubst :: TCvSubst #

zipTvSubst :: [TyVar] -> [Type] -> TCvSubst #

Generates the in-scope set for the `TCvSubst` from the types in the incoming environment. No CoVars, please!

mkTvSubstPrs :: [(TyVar, Type)] -> TCvSubst #

Generates the in-scope set for the `TCvSubst` from the types in the incoming environment. No CoVars, please!

notElemTCvSubst :: Var -> TCvSubst -> Bool #

unionTCvSubst :: TCvSubst -> TCvSubst -> TCvSubst #

getTvSubstEnv :: TCvSubst -> TvSubstEnv #

setTvSubstEnv :: TCvSubst -> TvSubstEnv -> TCvSubst #

getTCvInScope :: TCvSubst -> InScopeSet #

extendTCvInScope :: TCvSubst -> Var -> TCvSubst #

extendTCvInScopeList :: TCvSubst -> [Var] -> TCvSubst #

extendTCvInScopeSet :: TCvSubst -> VarSet -> TCvSubst #

extendTvSubstAndInScope :: TCvSubst -> TyVar -> Type -> TCvSubst #

lookupTyVar :: TCvSubst -> TyVar -> Maybe Type #

extendTCvSubst :: TCvSubst -> TyCoVar -> Type -> TCvSubst #

substTyVarBndr :: (?callStack :: CallStack) => TCvSubst -> TyVar -> (TCvSubst, TyVar) #

extendTvSubst :: TCvSubst -> TyVar -> Type -> TCvSubst #

isInScope :: Var -> TCvSubst -> Bool #

mkTCvSubst :: InScopeSet -> (TvSubstEnv, CvSubstEnv) -> TCvSubst #

mkTvSubst :: InScopeSet -> TvSubstEnv -> TCvSubst #

Mkae a TCvSubst with specified tyvar subst and empty covar subst

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

zipCoEnv :: [CoVar] -> [Coercion] -> CvSubstEnv #

substTy :: (?callStack :: CallStack) => TCvSubst -> Type -> Type #

Substitute within a `Type` The substitution has to satisfy the invariants described in Note [The substitution invariant].

substTys :: (?callStack :: CallStack) => TCvSubst -> [Type] -> [Type] #

Substitute within several `Type`s The substitution has to satisfy the invariants described in Note [The substitution invariant].

substTyWith :: (?callStack :: CallStack) => [TyVar] -> [Type] -> Type -> Type #

Type substitution, see `zipTvSubst`

substTyWithCoVars :: [CoVar] -> [Coercion] -> Type -> Type #

Substitute covars within a type

substTyAddInScope :: TCvSubst -> Type -> Type #

Substitute within a `Type` after adding the free variables of the type to the in-scope set. This is useful for the case when the free variables aren't already in the in-scope set or easily available. See also Note [The substitution invariant].

substTyUnchecked :: TCvSubst -> Type -> Type #

Substitute within a `Type` disabling the sanity checks. The problems that the sanity checks in substTy catch are described in Note [The substitution invariant]. The goal of #11371 is to migrate all the calls of substTyUnchecked to substTy and remove this function. Please don't use in new code.

substTysUnchecked :: TCvSubst -> [Type] -> [Type] #

Substitute within several `Type`s disabling the sanity checks. The problems that the sanity checks in substTys catch are described in Note [The substitution invariant]. The goal of #11371 is to migrate all the calls of substTysUnchecked to substTys and remove this function. Please don't use in new code.

substThetaUnchecked :: TCvSubst -> ThetaType -> ThetaType #

Substitute within a `ThetaType` disabling the sanity checks. The problems that the sanity checks in substTys catch are described in Note [The substitution invariant]. The goal of #11371 is to migrate all the calls of substThetaUnchecked to substTheta and remove this function. Please don't use in new code.

substTyWithBindersUnchecked :: [TyBinder] -> [Type] -> Type -> Type #

Type substitution using `Binder`s disabling the sanity checks. Anonymous binders simply ignore their matching type. The problems that the sanity checks in substTy catch are described in Note [The substitution invariant]. The goal of #11371 is to migrate all the calls of substTyUnchecked to substTy and remove this function. Please don't use in new code.

substTyWithUnchecked :: [TyVar] -> [Type] -> Type -> Type #

Type substitution, see `zipTvSubst`. Disables sanity checks. The problems that the sanity checks in substTy catch are described in Note [The substitution invariant]. The goal of #11371 is to migrate all the calls of substTyUnchecked to substTy and remove this function. Please don't use in new code.

substCoUnchecked :: TCvSubst -> Coercion -> Coercion #

Substitute within a `Coercion` disabling sanity checks. The problems that the sanity checks in substCo catch are described in Note [The substitution invariant]. The goal of #11371 is to migrate all the calls of substCoUnchecked to substCo and remove this function. Please don't use in new code.

substCoWithUnchecked :: [TyVar] -> [Type] -> Coercion -> Coercion #

Coercion substitution, see `zipTvSubst`. Disables sanity checks. The problems that the sanity checks in substCo catch are described in Note [The substitution invariant]. The goal of #11371 is to migrate all the calls of substCoUnchecked to substCo and remove this function. Please don't use in new code.

substTheta :: (?callStack :: CallStack) => TCvSubst -> ThetaType -> ThetaType #

Substitute within a `ThetaType` The substitution has to satisfy the invariants described in Note [The substitution invariant].

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.

coreView :: Type -> Maybe Type #

This function Strips off the top layer only of a type synonym application (if any) its underlying representation type. Returns Nothing if there is nothing to look through.

By being non-recursive and inlined, this case analysis gets efficiently joined onto the case analysis that the caller is already doing

tyCoVarsOfType :: Type -> TyCoVarSet #

Returns free variables of a type, including kind variables as a non-deterministic set. For type synonyms it does not expand the synonym.

tyCoVarsOfTypes :: [Type] -> TyCoVarSet #

Returns free variables of types, including kind variables as a non-deterministic set. For type synonyms it does not expand the synonym.

closeOverKinds :: TyVarSet -> TyVarSet #

Add the kind variables free in the kinds of the tyvars in the given set. Returns a non-deterministic set.

tyCoVarsOfTelescope :: [Var] -> TyCoVarSet -> TyCoVarSet #

Gets the free vars of a telescope, scoped over a given free var set.

tyCoVarsOfTypeAcc :: Type -> FV #

The worker for `tyVarsOfType` and `tyVarsOfTypeList`. The previous implementation used `unionVarSet` which is O(n+m) and can make the function quadratic. It's exported, so that it can be composed with other functions that compute free variables. See Note [FV naming conventions] in FV.

Eta-expanded because that makes it run faster (apparently)

tyCoVarsOfTypesAcc :: [Type] -> FV #

tyCoVarsOfTypeDSet :: Type -> DTyCoVarSet #

`tyVarsOfType` that returns free variables of a type in a deterministic set. For explanation of why using `VarSet` is not deterministic see Note [Deterministic FV] in FV.

tyCoVarsOfTypesDSet :: [Type] -> DTyCoVarSet #

Returns free variables of types, including kind variables as a deterministic set. For type synonyms it does not expand the synonym.

closeOverKindsDSet :: DTyVarSet -> DTyVarSet #

Add the kind variables free in the kinds of the tyvars in the given set. Returns a deterministic set.

tyCoVarsOfTypeList :: Type -> [TyCoVar] #

`tyVarsOfType` that returns free variables of a type in deterministic order. For explanation of why using `VarSet` is not deterministic see Note [Deterministic FV] in FV.

tyCoVarsOfTypesList :: [Type] -> [TyCoVar] #

Returns free variables of types, including kind variables as a deterministically ordered list. For type synonyms it does not expand the synonym.

toTcType :: Type -> TcType #

toTcTypeBag :: Bag EvVar -> Bag EvVar #

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 #

pprTvBndr :: TyVar -> SDoc #

pprTvBndrs :: [TyVar] -> SDoc #

type TypeSize = IntWithInf #

sizeType :: Type -> TypeSize #

sizeTypes :: [Type] -> TypeSize #

toposortTyVars :: [TyVar] -> [TyVar] #

Do a topological sort on a list of tyvars. This is a deterministic sorting operation (that is, doesn't depend on Uniques).