>>868 からの続き

foldr : (f1 a1 (f2 a2 (f3 a3 i)))
foldl : (f1 (f2 (f3 i a1) a2) a3)

一方 foldl は関数 f1 を第1引数である (f2 (f3 i a1) a2) に適用しようとする。
このとき、第1引数を評価した結果のカリー化された関数がまだ完成していないから、
第2引数である a3 もまだ評価されずにメモリに残ることになる。
では、いつまで残るかというと、評価をシミュレートしてみれば分かるが、
括弧の最も奥の (f3 i a1) が評価され、(f2 その結果 a2) が評価され、
(f1 その結果) が評価された後のカリー化された関数がやっと a3 に適用されるまで残る。
入れ子の次のレベルの深さにある a2 はその一段階前までメモリに残る。

つまり、foldl はリストの後ろの方の要素ほどメモリに長く居続ける。
これがあなたの言うメモリリークというものの正体。
ちなみに、Haskell ではこういう一見分かりにくいメモリ領域の使用を
メモリリークではなくスペースリークと呼ぶ。

私はこう解釈しているが、もし違ってたらごめん。