haskell - RankNTypes 中的 "n"是什么

标签 haskell polymorphism higher-rank-types

我明白了forall使我们能够编写多态函数。

据此chapter ,我们一般写的正规函数都是Rank 1类型。这个函数属于 Rank 2 类型:

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

它是这样解释的:

In general, a rank-n type is a function that has at least one rank-(n-1) argument but no arguments of even higher rank.



rank 参数实际上是什么意思?

有人可以举一个类似于上面的 Rank 3 类型的示例 foo功能。

最佳答案

Rank 是根据类型的结构归纳定义的:

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

等等。

关于haskell - RankNTypes 中的 "n"是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22362196/

相关文章:

java - 使用不同的类型实现相同的行为

haskell - "lemma"函数的一般类型应该如何理解?

haskell - Cabal:tar 存档中的文件不在预期目录中

haskell - OAuth2 证书应该如何存储在 Haskell 中

list - Haskell 列表的内部表示?

haskell - RankNTypes 和教堂数字

haskell - Haskell 中的换能器和单态性限制

解析 Haskell 自定义数据类型

c++ - 如何纠正多态性

c++ - 不带多态性的抽象基类