Note [The binders/kind/arity fields of a TyCon]
All TyCons have this group of fields
tyConBinders :: [TyConBinder]
tyConResKind :: Kind
tyConTyVars :: [TyVar] -- Cached = binderVars tyConBinders
NB: Currently (Aug 2018), TyCons that own this
field really only contain TyVars. So it is
[TyVar] instead of [TyCoVar].
tyConKind :: Kind -- Cached = mkTyConKind tyConBinders tyConResKind
tyConArity :: Arity -- Cached = length tyConBinders
They fit together like so:
* tyConBinders gives the telescope of type variables on the LHS of the
type declaration. For example:
type App a (b :: k) = a b
tyConBinders = [ Bndr (k::Type) (NamedTCB Inferred)
, Bndr (a:k->Type) AnonTCB
, Bndr (b:k) AnonTCB ]
Note that there are three binders here, including the
kind variable k.
See Note [tyConBinders and lexical scoping]
* See Note [VarBndrs, ForAllTyBinders, TyConBinders, and visibility] in GHC.Core.TyCo.Rep
for what the visibility flag means.
* Each TyConBinder in tyConBinders has a TyVar, and
that TyVar may scope over some other part of the TyCon's definition. Eg
type T a = a -> a
we have
tyConBinders = [ Bndr (a:Type) AnonTCB ]
synTcRhs = a -> a
So the 'a' scopes over the synTcRhs
* From the tyConBinders and tyConResKind we can get the tyConKind
E.g for our App example:
App :: forall k. (k->Type) -> k -> Type
We get a 'forall' in the kind for each NamedTCB, and an arrow
for each AnonTCB
tyConKind is the full kind of the TyCon, not just the result kind
* For type families, tyConArity is the arguments this TyCon must be
applied to, to be considered saturated. Here we mean "applied to in
the actual Type", not surface syntax; i.e. including implicit kind
variables. So it's just (length tyConBinders)
* For an algebraic data type, or data instance, the tyConResKind is
always (TYPE r); that is, the tyConBinders are enough to saturate
the type constructor. I'm not quite sure why we have this invariant,
but it's enforced by splitTyConKind References 1
- tyConBinders and lexical scoping GHC.Core.TyCon
Referenced by 1
- GHC.Core.TyCon call site