3

我不明白为什么会这样,指的是:Rank2Types的目的是什么?-> @dfeuer 解释:

... 要求参数是多态的不仅允许它与多种类型一起使用;它还限制了该函数可以用它的参数做什么以及它如何产生它的结果......

f :: (forall a . [a] -> a) -> IO ()

...实际上,返回不在给定列表中的元素的任何函数都不会进行类型检查

在对等级 N 类型的任何解释中,我都没有看到描述的这种效果(或好处),大部分时间是关于让被调用者选择类型等的故事……这对我来说很清楚且易于掌握,但是我看不出我们可以通过哪种优点(仅扩展等级)来控制/限制功能域(和共同域)......

如果有人可以更深入地了解这里涉及的 rankN 机制。谢谢

4

1 回答 1

7

只需根据您在顶层声明的多态函数来考虑它。带有签名的函数

foo :: [Int] -> Int

有很多可能的实现,比如

foo = sum

foo = length

foo _ = 39

但如果签名是,这些都不合法

foo :: [a] -> a

因为那样你就不能给出一个整数作为结果——你必须提供调用者要求的任何类型的结果。因此实现受到更多限制:结果必须来自输入列表,因为这是您知道元素具有类型的唯一地方,a无论调用者实际将其实例化为什么。只有类似的东西

foo = head

然后会工作。

您的 RankN 签名要求其参数是这样的多态函数,即参数不能是 a[Int] -> Int而只能是更具限制性的[a] -> a

于 2021-09-03T11:03:33.293 回答