在Erlang中使用Reduce实现Map

时间:2017-11-04 16:20:13

标签: erlang reduce

我是Erlang的初学者,我正在尝试根据Reduce函数实现Map函数。但是,我无法想象你怎么能这样做..我有 到目前为止尝试了这个:

reduce(_, Acc, [])     -> Acc;
reduce(Fn,Acc,[Hd|Tl]) -> reduce(Fn,Fn(Acc,Hd),Tl). 

map(F,[])      -> [];
map(F,[Hd|Tl]) -> [reduce(F,F(Hd),[]) | map(F,Tl)].

但是我看到这个解决方案有点天真。有什么帮助吗?

1 个答案:

答案 0 :(得分:5)

如果您已经拥有reduce功能,则不需要使用递归来映射列表。您可以将animation: #{$pulse-interval} pulseBG 1s linear infinite;作为函数传递给(Acc, X) -> [F(X) | Acc],然后传递给reduce,因为列表将以相反的顺序创建。

lists:reverse

我们正在反向创建列表,因为将一个元素添加到列表中的是O(1),而不像是附加的是O(n)。 map(F, List) -> lists:reverse(reduce(fun(Acc, X) -> [F(X) | Acc] end, [], List)). 也在O(1)中运行,这使得该映射函数为O(n)。如果我们做lists:reverse而没有反转,那就是O(n ^ 2)。