haskell - 你在 Haskell 中发现了更高级别的类型有什么用途?

标签 haskell types polymorphism type-systems higher-rank-types

关闭。这个问题需要更多 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/

相关文章:

c++ - 多态性 : raw pointer vs smart pointer

haskell - 需要以真实世界 Haskell 风格解决哪些 Haskell 主题?

c++ - 整数->指针转换规则

mysql - 如何在 MySQL 表中创建 boolean 列?

c# - 这是多态的例子吗?

java - 继承和多态问题

json - 使用 lens-aeson 提取 JSON 字段时结合棱镜

haskell - 为什么 `stack build` 会更改我的 .cabal 文件?

haskell - 如何使用 runhaskell 增加堆栈大小?

将 8 字节 char 数组转换为 long