Memory Leak (Hugs Only)
ちょっとしたテストデータの生成にrunhugsを使おうとして詰まった。
多分CAF leak*1なのだろうけれど、Hugs(runhugs)では「長い時間」データの出力をつづけることはできないのだろうか?
例 1
main = putStr $ concat $ repeat "aaa "
が
ERROR - Garbage collection fails to reclaim sufficient space
で止まる。けれども、このプログラムは同じことの繰り返しなので、回避策がある。
main = putStr "aaa " >> main
例 2
main = mapM_ (putStr . (++ " ") . show) [0..]
こっちになるとわからない。実際の用途はこれに近い(数列を出力し続ける)。
実用性の無い回避策しか思いつかなかった。
r = unsafePerformIO (newIORef 0) main = do x <- readIORef r writeIORef r (x + 1) putStr $ show x ++ " " main
*1:mainがputChar 'a' >> putChar 'a' ... というものに評価されてだんだん大きくなる