>loop 0 = loop (update 0)
>loop n = loop (update n)

この例は面白いですね.パターンマッチで引数を評価させるか
 loop n   = n `seq` loop (update n)
のようにseqで評価してやれば良いのですね.


次に,向井さんが仰っていた

>「cs' がリストである」
>という構成子(:)だけを見て終わってしまうためです。

について考えてみました.
リストで考えると分からなくなってしまいそうだったので
data Hoge = Hoge Int
のような,dataで考えてみました.

-----------------------------------
data Hoge = Hoge Int

update (Hoge d) = Hoge (d+1)
main   = loop $ Hoge 0
loop h = h `seq` loop $ update h
-----------------------------------

この場合,正しく動きませんでした.これが構築子Hogeだけを
正格評価しているという状態ですか?

Hogeの中のIntを正格評価すればいいので,update関数を

update (Hoge d) = Hoge $! (d+1)

としてやれば動きました.
大分分かってきた様な気がします.
(ついでに, ($!) a b = b `seq` a b の定義の意味も分かりました^^

メールを書いている途中で気づきましたが
Hoge $! (d+1)のような書き方を毎回しないですむ様に

data Hoge = Hoge !Int

という「!」を着けた書き方があるのですね.


まだ,無限リストが出てきた時等に,うまく動くか不安ですが
そっちについても考えて見ます.

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