[Haskell-cafe] Resources on how to implement (Haskell 98) kind-checking?

Benjamin Redelings benjamin.redelings at gmail.com
Thu Oct 14 14:13:46 UTC 2021

4. So, apparently GHC takes neither of these options, instead it does:

iii) Represent kinds with modifiable variables.  Substitution can be 
implemented by modifying kind variables in-place.  This is called 
"zonking" in the GHC sources.

This solves a small mystery for me, since I previously think that 
zonking was replacing remaining kind variables with '*'.  And indeed 
this seems to be an example of zonking, but not what zonking is.

5. It turns out that the Technical Supplement to the PolyKinds paper 
(Kind Inference for Datatypes) does have more detail.


On 10/12/21 3:35 PM, Benjamin Redelings wrote:
> Hi,
> 1. I'm looking for resources that describe how to implement kind 
> Haskell 98 checking.  Does anyone have any suggestions?
> * I've looked at the PolyKinds paper, but it doesn't cover type classes.
> * I've looked at the source code to GHC, but it is hard to follow for 
> a variety of reasons.  It isn't laid out like an algorithm 
> description, and the complexity to handle options like PolyKinds and 
> DataKinds makes the code harder to follow.
> 2. One question that came up is how to handle type variables that are 
> present in class methods, but are not type class parameters. If there 
> are multiple types/classes in a single recursive group, the kind of 
> such type variables might not be fully resolved until a later 
> type-or-class is processed.  Is there a recommended approach?
> I can see two ways to proceed:
> i) First determine the kinds of all the data types, classes, and type 
> synonyms.  Then perform a second pass over each type or class to 
> determine the kinds of type variables (in class methods) that are not 
> type class parameters.
> ii) Alternatively, record the kind of each type variable as it is 
> encountered -- even though such kinds may contain unification kind 
> variables.  After visiting all types-or-classes in the recursive 
> group, replace any kind variables with their definition, or with a * 
> if there is no definition.
> I've currently implement approach i), which requires doing kind 
> inference on class methods twice.  Is this the recommended approach?
> 3. Also, is Haskell 98 kind checking the same as Haskell 2010 kind 
> checking?
> -BenRI

More information about the Haskell-Cafe mailing list