7

我真的很喜欢 Haskell,尤其是它的强类型系统。当我编译 Haskell 程序时,它们通常没有错误,或者至少非常接近。

然而,Haskell 的主要问题是其未知的空间使用情况。至少在 C++ 中,您可以相当确定程序的空间使用情况。构造和解构对象时非常清楚。

在 Haskell 中,如果你写得不正确,像折叠这样简单的事情会在 thunk 中占用大量空间。由于内存不足而崩溃的程序并不比其他一些错误好多少,可以说更糟。

我知道有办法避免这些空间泄漏,但我正在寻找类型安全的方法来避免这些空间泄漏。例如,如果我弄错了,我会得到某种编译错误,而不仅仅是希望我的程序在生产时崩溃内存不足。例如,我很高兴替换标准库函数(例如,如果累加器不严格,则可能会说折叠有编译错误)

Haskell中是否存在这样的事情?

4

1 回答 1

1

众所周知,在 Haskell 中推理空间极其困难。西蒙·佩顿-琼斯(Simon Peyton-Jones)的旧书(1987 年)

http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/

有一个关于这个主题的特殊章节。

尽管如此,如果以特定方式编写 Haskell 代码,例如使用简单的生成器,则可以控制内存使用。以下论文(在 APLAS 2012 上发表)给出了一个关于内存和延迟的推理示例,该算法非常复杂,线性漂亮打印(顺便说一句,Haskell 中的标准漂亮打印库远非最佳:它们的格式化时间不是O(n ),其中 n 是输入的长度)。实验结果证实了记忆和时间复杂度的预测。请参阅 APLAS 演讲的幻灯片,其中显示了情节。

http://okmij.org/ftp/continuations/PPYield/index.html

于 2013-08-24T00:14:57.427 回答