list - 什么是 Haskell 的 Stream Fusion

标签 list optimization compiler-construction haskell

什么是 Haskell 的 Stream Fusion 以及如何使用它?

最佳答案

Logan 指出的论文很棒,但有点困难。 (问问我的学生就知道了。)其中也有很多关于“流融合如何工作”的内容,而只有一小部分是“什么是流融合以及如何使用它”。

流融合解决的问题是编写的功能代码通常会分配中间列表,例如,为了创建节点号的无限列表,您可能会编写

nodenames = map ("n"++) $ map show [1..]

简单的代码会分配一​​个无限的整数列表[1, 2, 3, ...],一个无限的字符串列表["1", "2", "3 ", ...],最终是一个无限的名称列表 ["n1", "n2", "n3", ...]。分配太多了。

流融合的作用是将像nodenames这样的定义转换为使用递归函数的东西,该递归函数仅分配结果所需的内容。一般来说,消除中间列表的分配被称为毁林。

要使用流融合,您需要编写非递归列表函数,这些函数使用 GHC ticket 915 中描述的流融合库中的函数。 (mapfoldr 等)而不是显式递归。该库包含所有 Prelude 函数的新版本,这些函数已被重写以利用流融合。显然,这个东西预计会进入下一个 GHC 版本 (6.12),但不在当前的稳定版本 (6.10) 中。如果你想使用库 Porges 在他的回答中有一个很好的简单解释。

如果您确实想要解释流融合的工作原理,请发布另一个问题——但这要困难得多。

关于list - 什么是 Haskell 的 Stream Fusion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/578063/

相关文章:

compiler-construction - 查找多语言编译器或优化器(C,C++,Java)

java - 如何计算位于给定数组的两个元素之间的数组元素的数量

MySQL 查询优化三重联接与嵌套选择

c++ - VC++ 允许的函数中局部变量的最大数量是多少?

Python、ProjectEuler、优化使代码变慢

mysql - 对许多参数表使用数据库投票表

java - Java 类文件的创建是确定性的吗?

python - 对一行中的元素求和(Python/Numpy)

Python 制作 list

r - 展平具有复杂嵌套结构的列表