将具有不同arity的函数传递给列表:在Erlang中映射

时间:2018-04-06 19:04:24

标签: erlang

假设我想使用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函数的第一个参数?

2 个答案:

答案 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'的映射,而不是过滤列表成员。