关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
10 个月前关闭。
Improve this question
更高等级的类型看起来很有趣。来自 Haskell wikibook来这个例子:
foo :: (forall a. a -> a) -> (Char,Bool)
foo f = (f 'c', f True)
现在我们可以评估
foo id
没有编译器爆炸。我在其他几个地方看到的真实示例很快在本书中紧随其后:ST monad 和 runST
.这很酷。但是我还没有遇到过这样的情况,我通过编写自己的函数并带有更高级别的参数来解决问题。你?你有哪些关于 rank-2 或 rank-n 多态性的例子?
最佳答案
Weirich 和 Washburnn 的“Boxes go Bananas”! ( paper , slides )
这是对它的全部内容的一个非常粗略且可能稍微不准确的解释:给定一个归纳类型,BGB 允许您表示该类型中“正”的函数空间——它们从不区分其参数的大小写。它们最多将它们的参数作为其他值的一部分(通常是相同类型)。
Weirich+Washburn 用这个来得到一个大概- adequate -XRankNTypes
中 lambda 演算的 HOAS 表示Haskell(有人证明它足够了吗?)。
我用它here (警告:乱码)转a
(forall g . GArrow g => g () x -> g () y)
成一个
(forall g . GArrow g => g x y)
这是因为 rank-2 多态类型无法“检查”其参数的结构——它所能做的就是将该参数“粘贴”到更大的结构中。一些诡计让我找出粘贴发生的位置,然后我将粘贴点(如果有)返回到
GArrow
的输入。 .您不能使用
Control.Arrow
执行此操作类,因为整个 Haskell 函数空间通过 arr
“泄漏”到其中.
关于haskell - 你在 Haskell 中发现了更高级别的类型有什么用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1476480/