我理解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
函数。
答案 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)
n
是forall
(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
是自然数的集合,并且S
是Type
和N
的笛卡尔积的期望子集。也就是说,S
的元素是元组(T, n)
,表示“类型T
的排名为n
”。以下规则定义类型的等级。
(a, 0)
在S
(T -> U, 0)
位于S
中,如果(T, 0)
和(U, 0)
都位于S
(T -> U, k+1)
位于S
中,如果(T, k)
和(U, k+1)
都位于S
(T, k+1)
在S
中,如果(T, k)
在S
中(forall a. T, k+1)
位于S
中,如果(T, k+1)
位于S
中,则(a, k)
位于S
根据以上定义,您问题中的id
和foo
的类型分别为等级1, 2, 3...
和2, 3, 4...
。