遅延評価と末尾再帰

そういうことで、問題1.11 の反復的なものを Haskell で書くときはこの前書いた

f n = iter 2 1 0 n
      where iter a b c count
                  | count == 0 = c
                  | otherwise = iter (a + 2 * b + 3 * c) a b (count - 1)

では固定スペースで実行できなくて、こうやらないといけない。

f n = iter 2 1 0 n
      where iter a b c count
                 | count == 0 = c
                 | otherwise = (iter $! (a + 2 * b + 3 * c)) a b (count - 1)

これだと反復ごとに (a + 2 * b + 3 * c) を計算してくれるわけです。ほんとかな。確かめ方がわからない。
あと、数列を無限リストで表現するとこう

fs = 0:1:2:zipWith3 (\a b c -> 3*a + 2*b + c) fs (tail fs) (drop 2 fs)

こっちの方がおれってばすげー感があっていいね。