遅延評価と末尾再帰
そういうことで、問題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)
こっちの方がおれってばすげー感があっていいね。