こんにちは。早川です。

A Functional Programming Approach という本に
今回の問題が詳しく載っていました。
-- 4.1.4 Deforestation with lists
http://www.iro.umontreal.ca/~lapalme/Algorithms-functional.html

リスト関数の合成では、いくつかの変換を経て
最適化が適用されるケースがあるそうです。

今回の reverse を使った下記の関数では

    tailn n    = reverse.(take n).reverse

以下のような変換が行われているのでしょうか。
-- かなりムリのある擬似コードですね (^^;;
tailn n xs = reverse.(take n).reverse
           = reverse (take n (reverse xs))
           = reverse (take n y:ys)
           = reverse (y:(take (n-1) ys))
           = (reverse (take (n-1) ys)) ++ [y]
           = (tailn (n-1) ys) ++ [y]
    where y:ys = reverse xs

最終的に末尾再帰最適化が適用されるらしいですが
これはどうなのでしょう..

いずれにしても :set +s で、実行結果が 0byte と出るので
一時的なリストは生成されていないはずですよね。

On Thu, 20 Mar 2003 10:27:50 +0900
Shinya Hayakawa <tetryl / tokyoprogrammer.com> wrote:
> ghci で実行してみたら以下のような結果になりました。
> これは reverse を使っても全リストを溜め込まないという
> ことでしょうか??

--
SH
tetryl / tokyoprogrammer.com


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/