Haskell, 限制 GHCI 内存

Haskell, Limit GHCI memory

我已经找到 this question 及其答案。

accepted answer 你可以看到我对解决方案的评论。例如,它似乎不适用于此功能:

fiblist = 0 : 1 : (zipWith (+) fiblist (tail fiblist))

fib :: (Integral a) => a -> String
fib n
  | n < 10000 = show (genericIndex fiblist n)
  | otherwise = error "The number is too high and the calculation might freeze your machine."

它仍然使系统无法使用,即使我只给 GHCI 256Mb 堆和 256Mb 堆栈 space。对于 length(无限列表)的简单调用,它确实有效。

我现在的问题是:所有情况下的解决方案是什么样的? (有吗?如果没有,为什么不呢?)

编辑 #1:附加信息

你的问题出在调用上。

stack ghci +RTS -M256m -K256m

Stack 不会将这些参数传递给 ghci:

/.../.stack/programs/x86_64-osx/ghc-7.10.2/lib/ghc-7.10.2/bin/ghc -B/.../.stack/programs/x86_64-osx/ghc-7.10.2/lib/ghc-7.10.2 --interactive -odir=/.../.stack/global/.stack-work/odir/ -hidir=/.../.stack/global/.stack-work/odir/

如果您改为直接调用 ghci:

/usr/local/lib/ghc-7.10.3/bin/ghc -B/usr/local/lib/ghc-7.10.3 --interactive +RTS -M256m -K256m

耶!争论!

我怀疑你的 +RTS ... 实际上被堆栈自己的 RTS 消耗了 - 例如,堆栈是用 Haskell 编写的,并且在你实际上希望 ghci 遵循所述约束时遵循这些约束。所以...为堆栈提交问题。

stack ghci +RTS -M256m -K256m

那不是设置 GHCi 的 RTS 选项,而是 stack。毕竟,stack也是写在Haskell中的,因此也可以采用RTS选项。

使用 --ghci-options 为 GHCi 提供额外的选项:

stack ghci --ghci-options="+RTS -M256m -K256m -RTS"

关闭 -RTS 是必要的,因为 stack 为 GHCi 提供了更多选项。