Defining a wired-in type of a different kind

Ben Gamari ben at
Wed Apr 3 11:11:49 UTC 2019

On April 3, 2019 7:06:11 AM EDT, "Jan van Br├╝gge" <jan at> wrote:
>when trying to get familiar with the GHC code base for my Bachelor's
>thesis. I followed the GHC Wiki, especially the case study about the
>bool type.
>Now I wanted to add a new kind and a new type inhabiting this kind
>(without having to expose a data constructor, so without datatype
>So in TysWiredIn.hs I added the new TyCons and added them to the list
>wired-in types:
>-- data Row a b
>rowKindCon :: TyCon
>rowKindCon = pcTyCon rowKindConName Nothing [alphaTyVar, betaTyVar] []
>rowKind :: Kind
>rowKind = mkTyConTy rowKindCon
>-- data RNil :: Row a b
>rnilTyCon :: TyCon
>rnilTyCon = mkAlgTyCon rnilTyConName [] rowKind [] Nothing []
>    (mkDataTyConRhs [])
>    (VanillaAlgTyCon (mkPrelTyConRepName rnilTyConName))
>    False
>rnilTy :: Type
>rnilTy = mkTyConTy rnilTyCon
>I also added two new empty data decls to ghc-prim, but if I inspect the
>kind of RNil it is not Row, but Type. So I think I am either
>understanding res_kind wrong or I have to do something completely
>I am also not sure how to verify that the code in TysWiredIn.hs is
>working at all, from all what I can tell it could just be the
>declarations in ghc-prim that result in what I see in ghci.
>Thank you and sorry for my beginner question

Can you post a full branch? Nothing in particular looks wrong with what you posted here but the PrelNames code is also relevant.


- Ben 

More information about the ghc-devs mailing list