在不同的hs文件中分离函数时,堆栈空间溢出

时间:2011-07-28 18:38:32

标签: haskell

我有一个巨大的haskell文件,编译和运行没有任何问题。我想将一些函数和类型定义放在一个通用hs文件中的单独模块中,然后将其导入到我的主模块中。虽然主程序编译没有任何错误(它也编译导入的模块),但当我尝试运行它时,我得到一个堆栈空间溢出。

我试过了:

ghc --make -O2 Main.hs
./Main -- stack space overflow

此外:

ghc --make -O2 Main.hs Other.hs -o RunMe
./RunMe -- again, stack space overflow

这是正确的编译方式还是我遗漏了什么?

2 个答案:

答案 0 :(得分:6)

您正在正确编译它。问题必须出在代码本身。将其拆分为不同的模块可能会导致GHC以不同的方式应用优化,从而导致出现此问题。

一个可能的原因是GHC以前能够使用严格性分析来生成在恒定堆栈空间中运行的程序。将模块分成两部分然后导致GHC不再能够做出相同的严格假设,因此无法保证使函数严格是安全的。

解决方案可能是添加您自己的严格注释或使用导致此问题的任何函数的严格版本。

答案 1 :(得分:5)

我可以想象当从定义它们的同一模块中调用函数时,GHC能够更好地优化所使用的函数堆栈(通过执行strictness analysis)。听起来你有空间泄漏在你的至少一个函数中,当GHC不知道如何调用函数时,GHC无法对其进行优化。

网上有很多解释来查找和修复堆栈溢出。例如,请参阅Haskell WikiRWH