haskellpolymorphismhigher-rank-types

What is "n" in RankNTypes


I understand how forall enables us to write polymorphic function.

According to this chapter, the normal function which we generally write are Rank 1 types. And this function is of Rank 2 type:

foo :: (forall a. a -> a) -> (Char,Bool)
foo f = (f 'c', f True)

It explains like this:

In general, a rank-n type is a function that has at least one rank-(n-1) argument but no arguments of even higher rank.

What does it actually mean by rank argument ?

Can somebody give an example of Rank 3 type which is similar to the above foo function.


Solution

  • Rank is defined inductively on the structure of types:

    rank (forall a. T) = max 1 (rank T)
    rank (T -> U)      = max (if rank T = 0 then 0 else rank T + 1) (rank U)
    rank (a)           = 0
    

    Note how it increases by one on the left-hand side of an arrow. So:

    Rank 0: Int
    Rank 1: forall a. a -> Int
    Rank 2: (forall a. a -> Int) -> Int
    Rank 3: ((forall a. a -> Int) -> Int) -> Int
    

    and so on.