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