【发布时间】:2013-02-28 18:27:16
【问题描述】:
我很喜欢 Haskell,但空间泄漏对我来说有点担心。我通常认为 Haskell 的类型系统比 C++ 更安全,但是使用 C 风格的循环我可以相当肯定它会在不耗尽内存的情况下完成,而 Haskell 的“折叠”可能会耗尽内存,除非你小心适当的字段是严格的。
我想知道是否有一个库使用 Haskell 类型系统来确保可以编译和运行各种结构,而不会产生 thunk。例如,no_thunk_fold 会抛出编译器错误,如果使用它的方式可能会产生 thunk。我知道这可能会限制我可以做的事情,但我想要一些我可以使用的功能作为一个选项,这会让我更有信心我没有不小心在某个地方留下一个重要的非严格字段并且我会用完空间。
【问题讨论】:
-
我不知道有什么工具可以做到这一点,但是你可以编写一个编译器插件来注释应该严格计算的函数:hackage.haskell.org/package/strict-ghc-plugin
-
使用精细分析器。
-
我不知道。当我刚开始学习时,空间泄漏对我来说是一个问题,但我已经建立了一种直觉,让我现在可以从很远的地方看到它们。你可以相当肯定 C 风格的循环,因为你已经建立了关于 C 中内存如何工作的直觉。这同样适用于 Haskell,但它是不同的直觉。
-
'thunk 的建立'很好! ... 在一定程度上。自从我第一次开始学习 Haskell 以来,我没有经历过明显的空间泄漏(或者更确切地说,没有人不知道我在求爱)(当我非常擅长它们的时候!)slideshare.net/tibbe/highperformance-haskell 的前 50 页中有一些很好的指针其中讨论了各种折叠,并且相应的显式递归具有这些特性。另一个明显的点是围绕真正合理的库组织代码,例如 ByteString、Text、Vector 等。
-
虽然不是编译时检查,但this 允许您使用运行时断言。
标签: haskell