假设我想使用lists:map
查看整数列表,我希望该映射返回一个长度相同的列表,只有大于某个值的数字。这就是我现在能够实现的目标:
f(Min) ->
List = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
lists:map(fun(N) -> max(N, Min) end, List).
对我所希望的可能性的粗略概念是:
f(Min) ->
List = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
lists:map(fun erlang:max/2 (Min), List).
有没有办法传递一个arity大于1的函数作为lists:map
函数的第一个参数?
答案 0 :(得分:2)
我希望维护列表中的所有元素,但替换为invalid 我可以采取的一些元素(在这个例子中,在Min下面) 输入
使用与Pie'Woh'Pah的答案不同的语法:
my_map(Target, Repl, Nums) ->
lists:map(
fun(Num) when Num =< Target -> Repl;
(Num) -> Num
end,
Nums
).
在shell中:
15> c(f1).
f1.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,f1}
16> f1:my_map(3, "-", [1, 2, 3, 4, 5]).
["-","-","-",4,5]
17> f1:my_map(
fun(X) -> 10 end,
[a, {b,c}],
[100, a, make_ref(), spawn(fun() -> 2 end),
{x, 1}, #{a=>1,b=>2}, [1,2,3]
]
).
[[a,{b,c}],
[a,{b,c}],
[a,{b,c}],
<0.68.0>,
{x,1},
#{a => 1,b => 2},
[1,2,3]]
答案 1 :(得分:1)
在这种情况下,你应该使用列表理解或lists:filter
:
NewList = [N || N <- List, N > Min]
或者
NewList = lists:filter(fun(N) -> N > Min end, List)
但是,如果您真的更喜欢使用lists:map
,那么当N
小于或等于Min
时,您需要考虑返回一些内容。
f1(N, Min) when N > Min -> N;
f1(N, Min) when N =< Min -> undefined. % return 'undefined'
myfun(Min, List) -> lists:map(fun(N) -> f1(N, Min) end, List).
正如你所看到的,你可以通过闭包来“关闭”任意数量的arity函数。
您最终会得到一个列表,其中包含N
替换为undefined
的所有数字,后跟超过N
的数字。
> myfun(5, [1, 2, 4, 6, 7]).
> [undefined, undefined, undefined, 6, 7]
lists:map
关注值X -> X'
的映射,而不是过滤列表成员。