我很难理解 Higher Kind 和 Higher Rank 类型。Kind 非常简单(感谢 Haskell 文献),我曾经认为 rank 在谈论类型时就像 kind,但显然不是!我阅读了维基百科的文章无济于事。那么有人可以解释一下什么是等级吗?更高等级是什么意思?高阶多态性?那是怎么回事(如果有的话)?比较 Scala 和 Haskell 也很棒。
1 回答
等级的概念与种类的概念并不真正相关。
多态类型系统的等级描述了forall
s 可能出现在类型中的什么位置。在 rank-1 类型系统中forall
,s 可能只出现在最外层,在 rank-2 类型系统中,它们可能出现在嵌套的一层,依此类推。
因此,例如forall a. Show a => (a -> String) -> a -> String
将是 rank-1 类型和forall a. Show a => (forall b. Show b => b -> String) -> a -> String
rank-2 类型。这两种类型之间的区别在于,在第一种情况下,函数的第一个参数可以是任何接受一个可显示参数并返回字符串的函数。因此类型函数Int -> String
将是有效的第一个参数(如假设函数intToString
),类型函数也是如此forall a. Show a => a -> String
(如show
)。在第二种情况下,只有类型函数才是forall a. Show a => a -> String
有效参数,即show
可以,但intToString
不会。因此,以下函数将是第二种类型的合法函数,但不是第一种(其中++
应该表示字符串连接):
higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42)
请注意,这里的函数f
适用于(可能)三种不同类型的参数。因此,如果f
该功能intToString
是行不通的。
默认情况下,Haskell 和 Scala 都是 Rank-1(因此上述函数不能用这些语言编写)。但是 GHC 包含一个语言扩展来启用 Rank-2 多态性和另一个启用任意 n 的 Rank-n 多态性的语言扩展。