小编Iva*_*yuk的帖子

无法强制尾递归严格

我正在处理Haskell程序中的内存泄漏,并且能够将其隔离为处理数组时非常基本的惰性问题。我了解那里发生了什么。数组的第一个元素被计算,其余的则产生延迟的计算,这消耗了堆。不幸的是,我无法对整个数组计算强制严格。

我尝试了seq,BangPatterns($!)的各种组合,但没有取得太大的成功。

import Control.Monad

force x = x `seq` x

loop :: [Int] -> IO ()
loop x = do
  when (head x `mod` 10000000 == 0) $ print x
  let x' = force $ map (+1) x
  loop x'

main = loop $ replicate 200 1
Run Code Online (Sandbox Code Playgroud)

具有标准配置文件选项的配置文件没有提供我已经知道的更多信息:

ghc -prof -fprof-auto-calls -rtsopts test.hs
./test +RTS -M300M -p -hc
Run Code Online (Sandbox Code Playgroud)

这将在几秒钟内耗尽内存。

haskell memory-leaks tail-recursion

2
推荐指数
1
解决办法
81
查看次数

标签 统计

haskell ×1

memory-leaks ×1

tail-recursion ×1