haskell - 多态递归的应用

标签 haskell recursion polymorphism

通过单态化(并且仅单态化)在语言中实现多态性的一个限制是,您失去了支持多态递归的能力(例如,请参阅 rust-lang #4287 )。

在编程语言中支持多态递归有哪些引人注目的用例?我一直在尝试寻找使用此功能的库/概念,到目前为止我遇到了一个示例:

  1. 在“命名问题”中,我们希望同时实现 (a) 快速捕获避免替换和 (b) 快速 alpha 等价检查,其中有 bound库(更详细的解释here)。在为函数式编程语言编写编译器时,这两个属性都是理想的。

为了防止问题过于宽泛,我正在寻找其他程序/库/研究论文,这些程序/库/研究论文展示了多态递归在传统计算机科学问题(例如涉及编写编译器的问题)中的应用。

我不寻找的东西的例子:

  1. 展示如何使用多态递归从范畴论中对 X 进行编码的答案,除非它们证明了对 X 进行编码如何有利于解决属于上述标准的 Y。

  2. 小玩具示例表明您可以使用多态递归来完成 X,但没有它就不能。

最佳答案

有时您希望对类型中的某些约束进行编码,以便在编译时强制执行它们。

例如,完全二叉树可以定义为

data CTree a = Tree a | Dup (CTree (a,a))

example :: CTree Int
example = Dup . Dup . Tree $ ((1,2),(3,4))

该类型将阻止不完整的树,如 ((1,2),3)存储在内部,强制不变。

冈崎的书展示了许多这样的例子。

如果想要对这样的树进行操作,就需要多态递归。 编写一个计算树高的函数,将 CTree Int 中的所有数字相加。 ,或者通用映射或折叠需要多态递归。

现在,需要/想要这种多态递归类型的情况并不常见。尽管如此,拥有它们还是很高兴。

在我个人看来,单态化有点不令人满意,不仅因为它阻止了多态递归,而且因为它需要为使用的每种类型编译一次多态代码。在 Haskell 或 Java 中,使用 Maybe Int, Maybe String, Maybe Bool不会导致 Maybe相关函数将被编译三次并在最终目标代码中出现三次。在 C++ 中,就会发生这种情况,导致目标代码膨胀。不过,在 C++ 中,这确实允许使用更有效的特化(例如 std::vector<bool> 可以使用位向量来实现)。这进一步启用了 C++ 的 SFINAE 等。不过,我认为我更喜欢多态代码编译一次并检查一次类型——之后保证所有类型都是类型安全的。

关于haskell - 多态递归的应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51093198/

相关文章:

java - 多态性和混淆实例

使用继承的c++语法

haskell 分组问题

haskell - 从 TemplateHaskell 中的文件中读取模块

java - 在递归中使用除法

recursion - 这两个递归 ocaml 函数有什么区别?

haskell - 为什么产品有界?

haskell - 自动生成镜头中的类型类的文档在哪里?

sql - 递归 COUNT 查询 (SQL Server)

php - 从公共(public)基函数访问类层次结构中的私有(private)属性