Note [Representing TyCon kinds: KindRep]
One of the operations supported by Typeable is typeRepKind,
typeRepKind :: TypeRep (a :: k) -> TypeRep k
Implementing this is a bit tricky for poly-kinded types like
data Proxy (a :: k) :: Type
Proxy :: forall k. k -> Type
The TypeRep encoding of `Proxy Type Int` looks like this:
$tcProxy :: GHC.Types.TyCon
$trInt :: TypeRep Int
TrType :: TypeRep Type
$trProxyType :: TypeRep (Proxy Type :: Type -> Type)
$trProxyType = TrTyCon $tcProxy
[TrType] -- kind variable instantiation
(tyConKind $tcProxy [TrType]) -- The TypeRep of
Type -> Type
$trProxy :: TypeRep (Proxy Type Int)
$trProxy = TrApp $trProxyType $trInt TrType
$tkProxy :: GHC.Types.KindRep
$tkProxy = KindRepFun (KindRepVar 0)
(KindRepTyConApp (KindRepTYPE LiftedRep) [])
Note how $trProxyType cannot use 'TrApp', because TypeRep cannot represent
polymorphic types. So instead
* $trProxyType uses 'TrTyCon' to apply Proxy to (the representations)
of all its kind arguments. We can't represent a tycon that is
applied to only some of its kind arguments.
* In $tcProxy, the GHC.Types.TyCon structure for Proxy, we store a
GHC.Types.KindRep, which represents the polymorphic kind of Proxy
Proxy :: forall k. k->Type
* A KindRep is just a recipe that we can instantiate with the
argument kinds, using Data.Typeable.Internal.tyConKind and
store in the relevant 'TypeRep' constructor.
Data.Typeable.Internal.typeRepKind looks up the stored kinds.
* In a KindRep, the kind variables are represented by 0-indexed
de Bruijn numbers:
type KindBndr = Int -- de Bruijn index
data KindRep = KindRepTyConApp TyCon [KindRep]
| KindRepVar !KindBndr
| KindRepApp KindRep KindRep
| KindRepFun KindRep KindRep
... References 0
This Note does not link to any other.
Referenced by 1
- Grand plan for Typeable GHC.Tc.Instance.Typeable