こんにちは,岩崎と申します.

Haskellでゲーム等,状態を持つ計算を繰り返す場合
状態を引数に関数を呼び続けるか,StateMonadを使う必要があると思います.
そこで,下のようなプログラムを書いて,コンパイルしてみたのですが
mainを使ってもStateMonad版のmain'を使っても,ヒープを使い切ってしまいます.

古い状態が,ガベージコレクトされる事を期待していたのですが
そのように動作しないみたいです.

何か良い解決法が有ったら,教えていただけないでしょうか.

-- プログラム----------------------------------------------
import Control.Monad.State

update   :: [Int] -> [Int]
update cs = newObjs ++ (filter (/=0) $  map (+(-1)) cs)
    where
      newObjs = [10,9..1]

main    = loop []
loop   :: [Int] -> IO ()
loop cs = do --print $ length cs  -- 子の数を表示
             --print cs           -- 子の一覧
             loop $ update cs

--StateMonad版
main'  = evalState (loop') []
loop' :: State [Int] (IO())
loop'  = do modify update
            loop'

-- ここまで------------------------------------------------


/***************************************
 Naoki Iwasaki

	mailto:safii / flightless-wing.com
	  http://www.flightless-wing.com/
	  http://www.kotokoto2.com/
	telnet://flightless-wing.com/
****************************************/
#include </dev/tty>

--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/