RankNTypes中的“n”是什么

时间:2014-03-12 19:43:04

标签: haskell polymorphism higher-rank-types

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

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

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

它解释如下:

  

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

排名争论究竟意味着什么?

有人可以举一个Rank 3类型的例子,它类似于上面的foo函数。

4 个答案:

答案 0 :(得分:12)

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

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

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

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

等等。

答案 1 :(得分:2)

nforall(s)嵌套的级别。所以,如果你有forall a. ((a -> a) -> Bla)(这只是一种写作(a -> a) -> Bla更简洁的方式),那么forall就在外面,适用于整个函数,因此它的等级为1. (forall a. a -> a) -> Bla forall仅适用于内部函数(即您作为参数的函数),因此排名为2.

如果您作为参数使用的函数本身将另一个函数作为参数,并且该函数在其类型中将具有forall,那么这将是第3级。依此类推。

答案 2 :(得分:1)

foo有一个参数包含一个通用量子,这就是需要RankN的原因。但是这个参数的类型本身a -> a是rank-1,它是唯一的参数,所以foo的等级 n n - 1 = 1,即foo是等级-2。

现在考虑

bar :: ((forall a. a -> a) -> (Char,Bool)) -> Int

这有一个foo类型的参数,正如我们所说的那样有2级。所以这是bar的论证中的最高等级; bar因此是3级功能。

答案 3 :(得分:0)

在罗伯特·哈珀(Robert Harper)的Practical Foundations of Programming Languages (first edition)中,通过推断规则说明了等级k的类型。使用此定义,如果类型的等级为k,则它的等级也为k+1。因此,类型与许多不同的等级k, k+1, k+2...相关联,这意味着我们可以使用关系代替函数进行形式化。假设Type是所有类型的集合,N是自然数的集合,并且STypeN的笛卡尔积的期望子集。也就是说,S的元素是元组(T, n),表示“类型T的排名为n”。以下规则定义类型的等级。

  1. (a, 0)S
  2. (T -> U, 0)位于S中,如果(T, 0)(U, 0)都位于S
  3. (T -> U, k+1)位于S中,如果(T, k)(U, k+1)都位于S
  4. (T, k+1)S中,如果(T, k)S
  5. (forall a. T, k+1)位于S中,如果(T, k+1)位于S中,则(a, k)位于S

根据以上定义,您问题中的idfoo的类型分别为等级1, 2, 3...2, 3, 4...