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