ghc-8.2.2: 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 TcTyVarBinder = TyVarBinder
- type TcTyCon = TyCon
- data ExpType
  - = Check TcType
  - | Infer !InferResult
- data InferResult = IR {
  - ir_uniq :: Unique
  - ir_lvl :: TcLevel
  - ir_inst :: Bool
  - ir_ref :: 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
- tcTypeLevel :: TcType -> TcLevel
- tcTyVarLevel :: TcTyVar -> TcLevel
- maxTcLevel :: TcLevel -> TcLevel -> TcLevel
- data UserTypeCtxt
  - = FunSigCtxt Name Bool
  - | InfSigCtxt Name
  - | ExprSigCtxt
  - | TypeAppCtxt
  - | ConArgCtxt Name
  - | TySynCtxt Name
  - | PatSynCtxt Name
  - | PatSigCtxt
  - | RuleSigCtxt Name
  - | ResSigCtxt
  - | ForSigCtxt Name
  - | DefaultDeclCtxt
  - | InstDeclCtxt
  - | SpecInstCtxt
  - | ThBrackCtxt
  - | GenSigCtxt
  - | GhciCtxt
  - | ClassSCCtxt Name
  - | SigmaCtxt
  - | DataTyCtxt Name
- pprUserTypeCtxt :: UserTypeCtxt -> SDoc
- isSigMaybe :: UserTypeCtxt -> Maybe Name
- data TcTyVarDetails
  - = SkolemTv TcLevel 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
- 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
- metaTyVarRef :: 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
- mkPhiTy :: [PredType] -> Type -> Type
- mkInfSigmaTy :: [TyVar] -> [PredType] -> Type -> Type
- mkSpecSigmaTy :: [TyVar] -> [PredType] -> Type -> Type
- mkSigmaTy :: [TyVarBinder] -> [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 (TyVarBinder, Type)
- tcSplitForAllTys :: Type -> ([TyVar], Type)
- tcSplitPiTys :: Type -> ([TyBinder], Type)
- tcSplitForAllTyVarBndrs :: Type -> ([TyVarBinder], 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
- tcFunResultTyN :: HasDebugCallStack => Arity -> Type -> Type
- tcSplitFunTysN :: Arity -> TcRhoType -> Either Arity ([TcSigmaType], TcSigmaType)
- tcSplitTyConApp :: Type -> (TyCon, [Type])
- tcSplitTyConApp_maybe :: HasCallStack => Type -> Maybe (TyCon, [Type])
- tcRepSplitTyConApp_maybe :: HasCallStack => Type -> Maybe (TyCon, [Type])
- tcRepSplitTyConApp_maybe' :: HasCallStack => Type -> Maybe (TyCon, [Type])
- tcTyConAppTyCon :: Type -> TyCon
- tcTyConAppTyCon_maybe :: Type -> Maybe 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)
- tcSplitNestedSigmaTys :: Type -> ([TyVar], ThetaType, Type)
- tcDeepSplitSigmaTy_maybe :: TcSigmaType -> Maybe ([TcType], [TyVar], ThetaType, TcSigmaType)
- eqType :: Type -> Type -> Bool
- eqTypes :: [Type] -> [Type] -> Bool
- nonDetCmpType :: Type -> Type -> Ordering
- nonDetCmpTypes :: [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 Bool
- 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
- isInsolubleOccursCheck :: EqRel -> TcTyVar -> TcType -> Bool
- checkValidClsArgs :: Bool -> Class -> [KindOrType] -> Bool
- hasTyVarHead :: Type -> Bool
- isRigidEqPred :: TcLevel -> PredTree -> Bool
- isRigidTy :: TcType -> Bool
- deNoteType :: Type -> Type
- 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
- pickCapturedPreds :: TyVarSet -> TcThetaType -> TcThetaType
- immSuperClasses :: Class -> [Type] -> [PredType]
- isImprovementPred :: PredType -> Bool
- tcTyFamInsts :: Type -> [(TyCon, [Type])]
- isTyFamFree :: Type -> Bool
- exactTyCoVarsOfType :: Type -> TyCoVarSet
- exactTyCoVarsOfTypes :: [Type] -> TyVarSet
- candidateQTyVarsOfType :: Type -> CandidatesQTvs
- candidateQTyVarsOfTypes :: [Type] -> CandidatesQTvs
- data CandidatesQTvs = DV {
  - dv_kvs :: DTyCoVarSet
  - dv_tvs :: DTyVarSet
  }
- anyRewritableTyVar :: Bool -> (TcTyVar -> Bool) -> TcType -> Bool
- 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 ArgFlag
  - = Required
  - | Specified
  - | Inferred
- mkForAllTy :: TyVar -> ArgFlag -> Type -> Type
- mkForAllTys :: [TyVarBinder] -> Type -> Type
- mkInvForAllTys :: [TyVar] -> Type -> Type
- mkSpecForAllTys :: [TyVar] -> Type -> Type
- mkInvForAllTy :: TyVar -> 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]
- 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])
- tcSplitMethodTy :: Type -> ([TyVar], PredType, Type)
- isRuntimeRepVar :: TyVar -> Bool
- isKindLevPoly :: 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 :: HasCallStack => 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 :: HasCallStack => TCvSubst -> Type -> Type
- substTys :: HasCallStack => TCvSubst -> [Type] -> [Type]
- substTyWith :: HasCallStack => [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
- substTyWithUnchecked :: [TyVar] -> [Type] -> Type -> Type
- substCoUnchecked :: TCvSubst -> Coercion -> Coercion
- substCoWithUnchecked :: [TyVar] -> [Type] -> Coercion -> Coercion
- substTheta :: HasCallStack => TCvSubst -> ThetaType -> ThetaType
- isUnliftedType :: HasDebugCallStack => Type -> Bool
- isUnboxedTupleType :: Type -> Bool
- isPrimitiveType :: Type -> Bool
- tcView :: Type -> Maybe Type
- coreView :: Type -> Maybe Type
- tyCoVarsOfType :: Type -> TyCoVarSet
- tyCoVarsOfTypes :: [Type] -> TyCoVarSet
- closeOverKinds :: TyVarSet -> TyVarSet
- tyCoFVsOfType :: Type -> FV
- tyCoFVsOfTypes :: [Type] -> FV
- tyCoVarsOfTypeDSet :: Type -> DTyCoVarSet
- tyCoVarsOfTypesDSet :: [Type] -> DTyCoVarSet
- closeOverKindsDSet :: DTyVarSet -> DTyVarSet
- tyCoVarsOfTypeList :: Type -> [TyCoVar]
- tyCoVarsOfTypesList :: [Type] -> [TyCoVar]
- noFreeVarsOfType :: Type -> Bool
- 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
- tyThingCategory :: TyThing -> String
- pprTheta :: ThetaType -> SDoc
- pprThetaArrowTy :: ThetaType -> SDoc
- pprClassPred :: Class -> [Type] -> SDoc
- pprTvBndr :: TyVarBinder -> SDoc
- pprTvBndrs :: [TyVarBinder] -> 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 TcTyVarBinder = TyVarBinder #

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 !InferResult |

Instances

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

data InferResult #

Constructors

IR |

Fields

- ir_uniq :: Unique
- ir_lvl :: TcLevel
- ir_inst :: Bool
- ir_ref :: IORef (Maybe TcType)

Instances

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

tcTypeLevel :: TcType -> TcLevel #

tcTyVarLevel :: TcTyVar -> TcLevel #

maxTcLevel :: TcLevel -> TcLevel -> TcLevel #

data UserTypeCtxt #

Constructors

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

pprUserTypeCtxt :: UserTypeCtxt -> SDoc #

isSigMaybe :: UserTypeCtxt -> Maybe Name #

data TcTyVarDetails #

Constructors

SkolemTv TcLevel 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 |

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 #

metaTyVarRef :: 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 #

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

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

Make a sigma ty where all type variables are `Inferred`. That is, they cannot be used with visible type application.

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 :: [TyVarBinder] -> [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 (TyVarBinder, 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.

tcSplitForAllTyVarBndrs :: Type -> ([TyVarBinder], 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 #

tcFunResultTyN :: HasDebugCallStack => Arity -> Type -> Type #

Strips off n *visible* arguments and returns the resulting type

tcSplitFunTysN :: Arity -> TcRhoType -> Either Arity ([TcSigmaType], TcSigmaType) #

Split off exactly the specified number argument types Returns (Left m) if there are `m` missing arrows in the type (Right (tys,res)) if the type looks like t1 -> ... -> tn -> res

tcSplitTyConApp :: Type -> (TyCon, [Type]) #

tcSplitTyConApp_maybe :: HasCallStack => Type -> Maybe (TyCon, [Type]) #

Split a type constructor application into its type constructor and applied types. Note that this may fail in the case of a `FunTy` with an argument of unknown kind `FunTy` (e.g. `FunTy (a :: k) Int`. since the kind of `a` isn't of the form `TYPE rep`). Consequently, you may need to zonk your type before using this function.

If you only need the `TyCon`, consider using `tcTyConAppTyCon_maybe`.

tcRepSplitTyConApp_maybe :: HasCallStack => Type -> Maybe (TyCon, [Type]) #

Like `tcSplitTyConApp_maybe` but doesn't look through type synonyms.

tcRepSplitTyConApp_maybe' :: HasCallStack => Type -> Maybe (TyCon, [Type]) #

Like `tcRepSplitTyConApp_maybe`, but returns `Nothing` if,

1. the type is structurally not a type constructor application, or
2. the type is a function type (e.g. application of `funTyCon`), but we currently don't even enough information to fully determine its RuntimeRep variables. For instance, `FunTy (a :: k) Int`.

By contrast `tcRepSplitTyConApp_maybe` panics in the second case.

The behavior here is needed during canonicalization; see Note [FunTy and decomposing tycon applications] in TcCanonical for details.

tcTyConAppTyCon :: Type -> TyCon #

tcTyConAppTyCon_maybe :: Type -> Maybe TyCon #

Like `tcRepSplitTyConApp_maybe`, but only returns the `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.

tcSplitNestedSigmaTys :: Type -> ([TyVar], ThetaType, Type) #

Split a sigma type into its parts, going underneath as many `ForAllTy`s as possible. For example, given this type synonym:

    type Traversal s t a b = forall f. Applicative f => (a -> f b) -> s -> f t

if you called `tcSplitSigmaTy` on this type:

    forall s t a b. Each s t a b => Traversal s t a b

then it would return `([s,t,a,b], [Each s t a b], Traversal s t a b)`. But if you instead called `tcSplitNestedSigmaTys` on the type, it would return `([s,t,a,b,f], [Each s t a b, Applicative f], (a -> f b) -> s -> f t)`.

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.

nonDetCmpType :: Type -> Type -> Ordering #

nonDetCmpTypes :: [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 Bool #

Like `tcEqType`, but returns information about whether the difference is visible in the case of a mismatch. `Nothing` : the types are equal `Just True` : the types differ, and the point of difference is visible `Just False` : the types differ, and the point of difference is invisible

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.

isInsolubleOccursCheck :: EqRel -> TcTyVar -> TcType -> Bool #

Is the equality a ~r ...a.... definitely insoluble or not? a ~r Maybe a -- Definitely insoluble a ~N ...(F a)... -- Not definitely insoluble -- Perhaps (F a) reduces to Int a ~R ...(N a)... -- Not definitely insoluble -- Perhaps newtype N a = MkN Int 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 #

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 #

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]

pickCapturedPreds :: TyVarSet -> TcThetaType -> TcThetaType #

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. In the list (F, tys) that is returned we guarantee that tys matches F's arity. For example, given type family F a :: * -> * (arity 1) calling tcTyFamInsts on (Maybe (F Int Bool) will return (F, [Int]), not (F, [Int,Bool])

This is important for its use in deciding termination of type instances (see Trac #11581). E.g. type instance G [Int] = ...(F Int type)... we don't need to take type into account when asking if the calls on the RHS are smaller than the LHS

isTyFamFree :: Type -> Bool #

Check that a type does not contain any type family applications.

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

exactTyCoVarsOfType :: Type -> TyCoVarSet #

exactTyCoVarsOfTypes :: [Type] -> TyVarSet #

candidateQTyVarsOfType :: Type -> CandidatesQTvs #

Worker for `splitDepVarsOfType`. This might output the same var in both sets, if it's used in both a type and a kind. See Note [CandidatesQTvs determinism and order] See Note [Dependent type variables]

candidateQTyVarsOfTypes :: [Type] -> CandidatesQTvs #

Like `splitDepVarsOfType`, but over a list of types

data CandidatesQTvs #

Constructors

DV |

Fields

- dv_kvs :: DTyCoVarSet
- dv_tvs :: DTyVarSet

Instances

Monoid CandidatesQTvs # |
Methods mempty :: CandidatesQTvs Source # mappend :: CandidatesQTvs -> CandidatesQTvs -> CandidatesQTvs Source # mconcat :: [CandidatesQTvs] -> CandidatesQTvs Source #
Outputable CandidatesQTvs # |
Methods ppr :: CandidatesQTvs -> SDoc # pprPrec :: Rational -> CandidatesQTvs -> SDoc #

anyRewritableTyVar :: Bool -> (TcTyVar -> Bool) -> TcType -> Bool #

# 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 *. Returns True if the argument is equivalent to Type and False otherwise.

isUnliftedTypeKind :: Kind -> Bool #

Returns True if the kind classifies unlifted types and False otherwise. Note that this returns False for levity-polymorphic kinds, which may be specialized to a kind that classifies unlifted types.

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 #

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 Note [TyBinders]

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

Argument Flag

Is something required to appear in source Haskell (`Required`), permitted by request (`Specified`) (visible type application), or prohibited entirely from appearing in source Haskell (`Inferred`)? See Note [TyBinders and ArgFlags] in TyCoRep

Constructors

Required |
Specified |
Inferred |

Instances

Eq ArgFlag # |
Methods (==) :: ArgFlag -> ArgFlag -> Bool # (/=) :: ArgFlag -> ArgFlag -> Bool #
Data ArgFlag # |

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> ArgFlag -> c ArgFlag Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c ArgFlag Source #

toConstr :: ArgFlag -> Constr Source #

dataTypeOf :: ArgFlag -> DataType Source #

dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c ArgFlag) Source #

dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ArgFlag) Source #

gmapT :: (forall b. Data b => b -> b) -> ArgFlag -> ArgFlag Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ArgFlag -> r Source #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ArgFlag -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> ArgFlag -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> ArgFlag -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> ArgFlag -> m ArgFlag Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> ArgFlag -> m ArgFlag Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> ArgFlag -> m ArgFlag Source #

Outputable ArgFlag # |
Methods ppr :: ArgFlag -> SDoc # pprPrec :: Rational -> ArgFlag -> SDoc #
Binary ArgFlag # |
Methods put_ :: BinHandle -> ArgFlag -> IO () # put :: BinHandle -> ArgFlag -> IO (Bin * ArgFlag) # get :: BinHandle -> IO ArgFlag #
Outputable tv => Outputable (TyVarBndr tv ArgFlag) # |
Methods ppr :: TyVarBndr tv ArgFlag -> SDoc # pprPrec :: Rational -> TyVarBndr tv ArgFlag -> SDoc #

mkForAllTy :: TyVar -> ArgFlag -> Type -> Type #

mkForAllTys :: [TyVarBinder] -> 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 Inferred, a common case

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

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

mkInvForAllTy :: TyVar -> Type -> Type #

Make a dependent forall over an Inferred (as opposed to Specified) variable

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

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

tcSplitMethodTy :: Type -> ([TyVar], PredType, Type) #

isRuntimeRepVar :: TyVar -> Bool #

Is a tyvar of type `RuntimeRep`?

isKindLevPoly :: Kind -> Bool #

Tests whether the given kind (which should look like `TYPE x`) is something other than a constructor tree (that is, constructors at every node).

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 :: HasCallStack => TCvSubst -> TyVar -> (TCvSubst, TyVar) #

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

isInScope :: Var -> TCvSubst -> Bool #

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

mkTvSubst :: InScopeSet -> TvSubstEnv -> TCvSubst #

Make a TCvSubst with specified tyvar subst and empty covar subst

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

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

substTy :: HasCallStack => TCvSubst -> Type -> Type #

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

substTys :: HasCallStack => TCvSubst -> [Type] -> [Type] #

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

substTyWith :: HasCallStack => [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.

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 :: HasCallStack => TCvSubst -> ThetaType -> ThetaType #

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

isUnliftedType :: HasDebugCallStack => Type -> Bool #

See Type for what an unlifted type is. Panics on levity polymorphic types.

isUnboxedTupleType :: Type -> Bool #

isPrimitiveType :: Type -> Bool #

Returns true of types that are opaque to Haskell.

tcView :: Type -> Maybe Type #

Gives the typechecker view of a type. This unwraps synonyms but leaves `Constraint` alone. c.f. coreView, which turns Constraint into TYPE LiftedRep. Returns Nothing if no unwrapping happens. See also Note [coreView vs tcView] in Type.

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. This function considers `Constraint` to be a synonym of `TYPE LiftedRep`.

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.

tyCoFVsOfType :: 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) See Note [FV eta expansion] in FV for explanation.

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

noFreeVarsOfType :: Type -> Bool #

Returns True if this type has no free variables. Should be the same as isEmptyVarSet . tyCoVarsOfType, but faster in the non-forall case.

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 #

tyThingCategory :: TyThing -> String #

pprTheta :: ThetaType -> SDoc #

pprThetaArrowTy :: ThetaType -> SDoc #

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

pprTvBndr :: TyVarBinder -> SDoc #

pprTvBndrs :: [TyVarBinder] -> SDoc #

type TypeSize = IntWithInf #

sizeType :: Type -> TypeSize #

sizeTypes :: [Type] -> TypeSize #

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

Do a topological sort on a list of tyvars, so that binders occur before occurrences E.g. given [ a::k, k::*, b::k ] it'll return a well-scoped list [ k::*, a::k, b::k ]

This is a deterministic sorting operation (that is, doesn't depend on Uniques).