> Erlang中文手册 > foldr/3 列表里的元素递归调用函数

lists:foldr/3

列表里的元素递归调用函数

用法:

foldr(Fun, Acc0, List) -> Acc1

内部实现:

-spec foldr(Fun, Acc0, List) -> Acc1 when
      Fun :: fun((Elem :: T, AccIn) -> AccOut),
      Acc0 :: term(),
      Acc1 :: term(),
      AccIn :: term(),
      AccOut :: term(),
      List :: [T],
      T :: term().

foldr(F, Accu, [Hd|Tail]) ->
    F(Hd, foldr(F, Accu, Tail));
foldr(F, Accu, []) when is_function(F, 2) -> Accu.

跟 lists:foldl/3 一样,都是列表 List 里的每一个元素和一个累积器(accumulator)参数 Acc0 作为 Fun 的参数被调用执行,并返回一个新的累积器 Acc1 跟列表的下一个元素调用,直到调用完列表里的所有元素,最终返回累积器 Acc 的结果值。只是获取元素的顺序不一样,lists:foldl/3 是从左向右,而 lists:foldr/3 是从右向左。lists:foldl/3 采用的是尾递归的递归方式,比 lists:foldr/3 会更高效些。

lists:foldr(fun(E, AccList) -> [E | AccList] end, [], [a, b, c, d, e]).
lists:foldl(fun(E, AccList) -> [E | AccList] end, [], [a, b, c, d, e]).