RankNTypes中的"n"是什么

Sib*_*ibi 12 polymorphism haskell higher-rank-types

我理解如何forall使我们能够编写多态函数.

根据这一,我们通常写的正常函数是Rank 1类型.此功能属于Rank 2类型:

foo :: (forall a. a -> a) -> (Char,Bool)
foo f = (f 'c', f True)
Run Code Online (Sandbox Code Playgroud)

它解释如下:

通常,rank-n类型是具有至少一个rank-(n-1)参数但没有更高秩的参数的函数.

它通过排名论证实际意味着什么?

有人可以给出一个类似于上述foo功能的Rank 3类型的例子.

And*_*erg 13

排名是在类型结构上归纳定义的:

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
Run Code Online (Sandbox Code Playgroud)

注意它在箭头左侧的增加量是多少.所以:

Rank 0: Int
Rank 1: forall a. a -> Int
Rank 2: (forall a. a -> Int) -> Int
Rank 3: ((forall a. a -> Int) -> Int) -> Int
Run Code Online (Sandbox Code Playgroud)

等等.

  • @ sepp2k:如果你返回一个多态函数,它就像你的整个多参数函数是(rank-1)多态的一样,但是类型变量恰好在第一个参数中没有出现. (8认同)
  • @ sepp2k,这就是定义的方式.更深层次的原因是箭头的左侧具有负极性,右侧是正极性.(它与订单的定义类似.) (5认同)
  • 我不认为这是对的:例如`fix ::(a - > a) - > a`肯定是rank-1,而不是rank-2. (2认同)