Erlang中如何向lists:map传入不同元数的函数?
如何给Erlang的lists:map传入元数大于1的函数
当然可以实现!不过Erlang的lists:map/2要求传入的是单参数函数,直接传erlang:max/2(二参数)是不行的——但我们可以通过**偏应用(Partial Application)**把多参数函数转换成单参数函数,完美适配map的要求。
你的需求的正确实现方式
你想要的效果其实可以用匿名函数轻松实现,把Min固定为max/2的其中一个参数,生成一个只接受列表元素的单参数函数:
f(Min) -> List = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], lists:map(fun(N) -> max(N, Min) end, List).
这里的fun(N) -> max(N, Min) end就是一个偏应用后的单参数函数:它捕获了外部变量Min,每次接收列表里的元素N时,都会调用max(N, Min)并返回结果,完全符合你的需求。
为什么你原来的写法不行?
你尝试的lists:map(fun erlang:max/2 (Min), List)不符合Erlang的语法:fun erlang:max/2是一个二参数函数的引用,直接加(Min)会被解释成调用这个函数并传入Min,而不是生成一个绑定了Min的新函数——这会导致编译错误,因为max/2需要两个参数,你只传了一个。
额外小技巧
如果追求更简洁的写法,其实可以省略erlang:前缀(因为max/2是Erlang默认导入的函数),代码会更清爽:
f(Min) -> List = [1,2,3,4,5,6,7,8,9,10], lists:map(fun(N) -> max(N, Min) end, List).
这种偏应用的匿名函数写法是Erlang社区处理这类场景的标准方式,既清晰又符合语言的设计逻辑。
内容的提问来源于stack exchange,提问作者goncalotomas
相关产品推荐
相关产品推荐

