用Erlang中的Reduce实现Map

用Erlang中的Reduce实现Map,erlang,reduce,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)]. 然而,我觉得这个解

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

然而,我觉得这个解决方案有点幼稚。有什么帮助吗?

如果您已经有reduce函数,则不需要使用递归映射列表。您只需将
(Acc,X)->[F(X)| Acc]
作为函数传递到
reduce
,然后在结束时调用
list:reverse
,因为列表将按相反顺序创建

map(F, List) -> lists:reverse(reduce(fun(Acc, X) -> [F(X) | Acc] end, [], List)).

我们以相反的方式创建列表,因为在列表中预先添加元素是O(1),而追加元素是O(n)<代码>列表:反向也在O(1)中运行,这使得该映射函数为O(n)。如果我们做了
fun(Acc,X)->Acc++[F(X)]end
并且没有反转,那将是O(n^2)。

如果已经有reduce函数,则不需要使用递归来映射列表。您只需将
(Acc,X)->[F(X)| Acc]
作为函数传递到
reduce
,然后在结束时调用
list:reverse
,因为列表将按相反顺序创建

map(F, List) -> lists:reverse(reduce(fun(Acc, X) -> [F(X) | Acc] end, [], List)).
我们以相反的方式创建列表,因为在列表中预先添加元素是O(1),而追加元素是O(n)<代码>列表:反向也在O(1)中运行,这使得该映射函数为O(n)。如果我们做了
fun(Acc,X)->Acc++[F(X)]结束
并且没有反转,那将是O(n^2)。

我认为你在匿名函数中使用了F(X)。。不过还是要谢谢你:)我想你应该在匿名函数中使用F(X)。。不过还是要谢谢你:)