Haskell类型安全的空间使用

Cli*_*ton 7 haskell

我真的很喜欢Haskell,特别是它的强类型系统.当我得到Haskell程序进行编译时,它们通常没有bug,或者至少非常接近它.

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

在Haskell中,如果你没有正确地编写它们,像折叠一样简单的东西可以在thunk中使用大量的空间.由于内存不足导致程序崩溃并没有比其他一些错误好得多,可以说更糟糕.

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

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

Ole*_*leg 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