> Erlang中文手册 > mapfoldl/3 列表里的每一个元素被函数调用

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]).