読者です 読者をやめる 読者になる 読者になる

foldl と foldr の理解

erlang lists

サンプルは全て man lists から。

lists:forldl と lists:foldr が便利なのですが、いまいちきっちり収まった使い方が出来てません。
未来の自分のため+恥をかいて憶えるためにメモ。

まずは lists:foldl から。簡単なサンプルとして 1 から 10 までの合計を求める。といったものです。

> lists:foldl(fun(X, Sum) -> X + Sum end, 0, lists:seq(1,10)). 
55

動きとしては まず Sum には 0 そして X には 1 が入ります。その合計が Sum として渡され、X には 2 が渡されるといった形になります。fun() の結果が Sum に入るといった形になります。

foldl と foldr の速度差なのですが、断然 foldl の方が早いです。

foldl では list の出力を左から出していきます。foldr ではリストの出力を右からつまり tail から出していきます。
reverse を一度書けた状態で foldl をやるような感じです。

なんか便利なんですけど、使いたいときにさくっと使えないので、今後はさくっと使えるようになれるようにしていきたいと思います。

> lists:foldl(fun(A, AcctIn) -> io:format("~p ", [A]), AcctIn end, void, [1,2,3]).
1 2 3 void
> lists:foldr(fun(A, AcctIn) -> io:format("~p ", [A]), AcctIn end, void, [1,2,3]).
3 2 1 void

これは、リストをたぐっていって、最後に今までの合計を AcctIn を出力しています、foldl と foldr の差が分かりやすいかと思います。