我有一个很大的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这是正确的编译方式吗?还是我遗漏了什么?
发布于 2011-07-29 02:48:34
你的编译是正确的。问题一定出在代码本身。将它分成不同的模块可能会导致GHC应用不同的优化,从而导致这个问题浮出水面。
一个可能的原因是GHC以前能够使用严格性分析来生成在恒定堆栈空间中运行的程序。然后将模块一分为二,导致GHC不再能够做出同样严格的假设,因此无法保证严格的函数是安全的。
解决方案可能是添加您自己的严格性注释,或者使用导致这种情况的任何函数的严格版本。
发布于 2011-07-29 02:49:00
我可以想象,当函数从定义它们的相同模块中调用时,GHC能够更好地优化所使用的函数堆栈(通过执行strictness analysis)。听起来你至少有一个函数有空间泄漏,当GHC不知道函数是如何调用的时候,它无法优化它。
网上有很多关于查找和修复堆栈溢出的解释。例如,请参见Haskell Wiki和RWH。
https://stackoverflow.com/questions/6863984
复制相似问题