我是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)].
但是我看到这个解决方案有点天真。有什么帮助吗?
答案 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)。