lists:mapfoldl/3
列表里的每一个元素被函数调用
用法:
mapfoldl(Fun, Acc0, List1) -> {List2, Acc1}
内部实现:
-spec mapfoldl(Fun, Acc0, List1) -> {List2, Acc1} when
Fun :: fun((A, AccIn) -> {B, AccOut}),
Acc0 :: term(),
Acc1 :: term(),
AccIn :: term(),
AccOut :: term(),
List1 :: [A],
List2 :: [B],
A :: term(),
B :: term().
mapfoldl(F, Accu0, [Hd|Tail]) ->
{R,Accu1} = F(Hd, Accu0),
{Rs,Accu2} = mapfoldl(F, Accu1, Tail),
{[R|Rs],Accu2};
mapfoldl(F, Accu, []) when is_function(F, 2) -> {[],Accu}.
这个函数是 map 和 foldl 函数结合体,把列表 List1 里的每一个元素被函数 Fun 调用,执行后花括号的第一个值作为返回值返回,第 2 个值作为函数 Fun 的参数,用在下一次调用。
lists:mapfoldl(fun(X, Sum) -> {2 * X, X + Sum} end, 0, [1, 2, 3, 4, 5]).