Haskell 类型安全的空间使用
Posted
技术标签:
【中文标题】Haskell 类型安全的空间使用【英文标题】:Haskell type-safe space usage 【发布时间】:2013-08-22 01:57:29 【问题描述】:我真的很喜欢 Haskell,尤其是它的强类型系统。当我编译 Haskell 程序时,它们通常没有错误,或者至少非常接近。
然而,Haskell 的主要问题是它未知的空间使用。至少在 C++ 中,您可以相当确定程序的空间使用情况。构造和解构对象时非常清楚。
在 Haskell 中,如果您没有正确编写它们,那么像折叠这样简单的事情可能会在 thunk 中占用大量空间。由于内存不足而崩溃的程序并不比其他一些错误好多少,可以说更糟。
我知道有一些方法可以避免这些空间泄漏,但我正在寻找类型安全的方法来避免这些空间泄漏。例如,如果我弄错了,我会得到某种编译错误,而不仅仅是希望我的程序在生产时崩溃内存不足。例如,我很乐意替换标准库函数(例如,如果累加器不严格,则可能会说折叠有编译错误)
Haskell 中是否存在这样的事情?
【问题讨论】:
假设这个动物园blog.ezyang.com/2011/05/space-leak-zoo 应该控制哪些类型的泄漏类型系统?对于流式泄漏,管道就足够了。 例如 Thunk 泄漏。你能否解释一下管道如何与纯代码一起使用来控制空间使用(即,通过列表泄漏但不通过管道泄漏的东西? 有许多结构,如管道,旨在让您以受控的速率处理数据流。它们包括迭代器、管道、管道和 io-streams 以及一些用于高性能计算的库,这些库执行称为流融合的优化。 查看社区最近的这篇文章:apfelmus.nfshost.com/blog/2013/08/21-space-invariants.html 【参考方案1】:众所周知,在 Haskell 中推理空间极其困难。 Simon Peyton-Jones 的旧书(1987 年)
http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/
有一个关于这个主题的特殊章节。
不过,如果以特定方式编写 Haskell 代码,例如,使用简单的生成器, 内存使用是可以控制的。以下论文(在 APLAS 2012 上发表)给出了一个关于非常复杂的算法的内存和延迟的推理示例,线性 漂亮的打印(顺便说一句,Haskell 中的标准漂亮打印库远非最佳: 它们的格式化时间是 not O(n),其中 n 是输入的长度)。实验结果证实了记忆和时间复杂度的预测。请查看 APLAS 演讲的幻灯片,其中显示了情节。
http://okmij.org/ftp/continuations/PPYield/index.html
【讨论】:
以上是关于Haskell 类型安全的空间使用的主要内容,如果未能解决你的问题,请参考以下文章
确保两个 (G) ADT 在 (GHC) Haskell 中具有相同的底层表示