foldr と foldl の計算は模式的に次のように表せる。

foldr : (f a1 (f a2 (f a3 i)))
foldl : (f (f (f i a1) a2) a3)

分かりやすくするために、本来はひとつの同じ関数 f に評価順番号を添えて区別してみる。

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

foldr はまず関数 f1 を a1 に適用し、a1 を評価し、
その結果としてカリー化された関数(仮に fa1 とする)を返す。
この時点で、a1 は既に評価されてしまったので、a1 の情報はその評価結果の値のみが残り、
a1 を評価するために必要だったその他の情報はもう不要なので捨てられる。
つまり、メモリから破棄される。

(fa1 (f2 a2 (f3 a3 i)))

次に関数 fa1 を (f2 a2 (f3 a3 i)) に適用し、(f2 a2 (f3 a3 i)) を評価する。
そして関数 f2 を a2 に適用し、a2 を評価し、カリー化された関数 fa2 を返す。

(fa1 (fa2 (f3 a3 i)))

以下繰り返し。

foldl の方は次スレ >>869