我有一个很难理解更高层次的VS更高级别的类型。 一种是非常简单的(感谢Haskell的文献为)和我曾经以为排名就像是那种当谈论类型,但显然不是! 我读了维基百科的文章无济于事。 所以,可以有人请解释一下什么是排名? 什么是更高的排名意味着什么? 更高级别多态性? 怎么说来种(如果有的话)? Scala和Haskell的比较将是真棒,太。
Answer 1:
秩的概念是不是真的涉及到各种各样的概念。
多态类型系统的等级描述了forall
S可出现在类型。 在秩1型系统forall
S可以仅出现在最外层,在秩2型系统,他们可能出现在嵌套中的一个水平等。
因此,例如forall a. Show a => (a -> String) -> a -> String
forall a. Show a => (a -> String) -> a -> String
将是秩1型和forall a. Show a => (forall b. Show b => b -> String) -> a -> String
forall a. Show a => (forall b. Show b => b -> String) -> a -> String
将是一个秩为2的类型。 这两种类型之间的区别在于,在第一种情况下,第一个参数的函数可以是带一个showable参数,并返回字符串的任何功能。 所以类型的功能Int -> String
将是一个有效的第一个参数(如假设的功能intToString
),所以会类型的函数forall a. Show a => a -> String
forall a. Show a => a -> String
(如show
)。 在第二种情况下,只有类型的函数forall a. Show a => a -> String
forall a. Show a => a -> String
将是一个有效的论据,即show
会好起来的,但intToString
不会。 结果下面的函数将是第二类型的法律功能,但不包括第一(其中++
应该代表字符串连接):
higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42)
请注意,这里的功能f
适用于(潜在的)三种不同类型的参数。 所以,如果f
是功能intToString
这是行不通的。
两者的Haskell和Scala是秩-1(所以上述功能不能被写入在这些语言)默认情况下。 但GHC包含了语言的扩展,使排名-2基因多态性与另一个启用排名-N多态性任意N。