向井さん,ご丁寧にありがとうございます.

助言を参考に書いてみた所,下記の4つのmain全てが
ヒープを大量に消費する事なく動く事が確認できました.

結局の所Haskellでは,stdioやファイルなどIOに絡まない計算は
評価されないのでしょうか.
それ以外はseqを使った場合だけ,強制的に正格評価をするという事ですか?


> また、現実的にはゲームの状態は環境とのやりとりを含むので(loop のように
> 停止しない処理には意味がないので)、最終的には StateT をIO で使うことに
> なると思います。これならこれで、 IO になるので上手く行くかもしれません。

今まで私は「State a (IO())」と「IORef a」の違いが分からず,
最近は,関数名が短い(^^;)Stateの方を使っています.


STMは触った事がないので,少し調べてみますね.


遅延評価のおかげで
updaterの無限リストを作って,毎フレーム先頭から順に適用
みたいな使い方が出来て楽しいのですが

遅延評価のせいで,
あるデータがいつまで参照されているのか,分かりにくかったりで苦労もします.

早く遅延評価を使いこなしたいです.


-- ここから コード----------------------------------------
import Data.IORef
import Control.Monad.State

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

-- seq 版
main    = loop []
loop cs = sum cs' `seq` loop cs'
  where cs' = update cs

-- State+seq 版
main'  = evalState (loop') []
loop'  = do cs <- gets update
            put cs
            sum cs `seq` loop'

-- IORef+seq 版
main''   = newIORef [] >>= loop''
loop'' r = do os <- readIORef r
              writeIORef r $ update os
              sum os `seq` loop'' r

-- printで評価版
main'''    = loop''' []
loop''' cs = let updated = update cs
             in do print $  length updated
                   loop''' updated

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

PS.
2月頃からHaskellの勉強を始めたのですが
「やさしい Haskell 入門」やHugsのライブラリのソースと格闘し
やっと少し書けるようになったかな,と思った頃に
「入門Haskell」が発売され,それを読みながら
もう少し,Haskellに興味を持つのが遅ければずいぶん楽に勉強ができただろう
と悔しい思いをしました^^;
それからしばらくは,プリントアウトした「やさしい Haskell 入門」の代わりに
ずっと持ち歩いていました.とても勉強になりました,ありがとうございます.

/***************************************
 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/