Я имею дело с утечками памяти в моей программе на 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
Профиль со стандартными параметрами профилирования не дал мне больше информации, чем я уже знаю:
ghc -prof -fprof-auto-calls -rtsopts test.hs
./test +RTS -M300M -p -hc
Недостаточно памяти за несколько секунд.