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

vis*_*vis 5 haskell

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

我试过了:

ghc --make -O2 Main.hs
./Main -- stack space overflow
Run Code Online (Sandbox Code Playgroud)

也:

ghc --make -O2 Main.hs Other.hs -o RunMe
./RunMe -- again, stack space overflow
Run Code Online (Sandbox Code Playgroud)

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

ham*_*mar 6

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

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

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

  • 无偿使用INLINE pragma也可能会解决这个问题. (2认同)

Ant*_*tti 5

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

网络上有很多解释来查找和修复堆栈溢出.例如,参见Haskell WikiRWH.