首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将匿名函数作为参数传递给Erlang中的函数?

将匿名函数作为参数传递给Erlang中的函数?
EN

Stack Overflow用户
提问于 2014-11-04 05:50:26
回答 2查看 5.1K关注 0票数 6

二郎对可读性给予了相当的重视。

模式匹配、列表理解是最好的工具,可以在不破坏可读性的情况下最小化代码。然而,在erlang中,匿名函数经常作为函数参数传入。

对我来说,读that.Is是件很烦人的事,有什么特别的原因吗?

对于一般的前人

代码语言:javascript
运行
复制
hhfuns:fold(fun(A,B) -> A + B end, 0, lists:seq(1,6)).
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-04 06:29:31

你可以用任何你喜欢的方式来处理。语法一开始可能很烦人,但您可能会习惯它。在任何情况下,您都试图将一个值传递给一个函数,就像处理任何其他参数一样。如果你记住这一点,你就会意识到你有三种方法可以做到这一点。

考虑以下示例模块:

代码语言:javascript
运行
复制
-module(funplay).
-export([external/1, internal/1, inline/1]).

apply_foo(Foo, Thingy) -> Foo(Thingy).

add_one(N) -> N + 1.

external(X) ->
    apply_foo(fun add_one/1, X).

internal(X) ->
    AddOne = fun(N) -> N + 1 end,
    apply_foo(AddOne, X).

inline(X) ->
    apply_foo(fun(N) -> N + 1 end, X).

我想不出比上面的代码更好的解释方法了。

如果我知道我将使用相同的东西(在这种情况下,我真的需要定义这个过程,而不是在任何地方匿名重写),我更喜欢外部方式。当我需要将非平凡或多行条件传递给函数时,我更喜欢内部方式(只是更容易阅读和我讨厌争论中的缩进),或者在同一个函数中需要它不止一次,我更喜欢在过滤器或折叠之类的东西中进行简单检查的内联方式。

票数 10
EN

Stack Overflow用户

发布于 2014-11-04 08:11:33

选择语法是一个品味的问题,或者公司的编码规则,但有趣的是这个特性的威力。下面是一个示例,我将消息中的函数发送给另一个节点,该节点依次转发到最终执行它的进程列表(请注意,我选择了匿名函数,这样做-我确信接收节点能够执行该函数):

启动2个节点:

代码语言:javascript
运行
复制
erl -sname node1
erl -sname node2

在node1上,在shell中(需要R17来使用这个语法):

代码语言:javascript
运行
复制
Loop = fun Loop(X) -> receive                                             
{forward, Mess} -> lists:foreach(fun(Pid) -> Pid ! Mess end, X), Loop(X); 
stop -> ok                                                                
end                                                                       
end.

Proc = fun Proc(X) -> receive
{do,Fun} -> Y = Fun(X), Proc(Y);
stop -> ok                     
end                            
end.                           

L = [spawn(fun() -> Proc(0) end) || _ <- lists:seq(1,10)].

register(server,spawn(fun() -> Loop(L) end)).

在node2上:

代码语言:javascript
运行
复制
(node2@XXX)1>net_adm:ping(node1@XXX).                                                              
pong               
(node2@XXX)2> {server,node1@XXX} ! {forward,{do,fun(X) ->Self = self(), io:format("~p state is ~p~n",[Self,X]),X end}}.
{forward,{do,#Fun<erl_eval.6.90072148>}}
(node2@XXX)3> {server,node1@XXX} ! {forward,{do,fun(X) -> X + 1  end}}.                            
{forward,{do,#Fun<erl_eval.6.90072148>}}
(node2@XXX)4> {server,node1@XXX} ! {forward,{do,fun(X) ->Self = self(), io:format("~p state is ~p~n",[Self,X]),X end}}.
{forward,{do,#Fun<erl_eval.6.90072148>}}
(node2@XXX)4> 

在node1上的结果:

代码语言:javascript
运行
复制
<0.42.0> state is 0   
<0.43.0> state is 0   
<0.44.0> state is 0   
<0.45.0> state is 0   
<0.46.0> state is 0   
<0.47.0> state is 0   
<0.48.0> state is 0   
<0.49.0> state is 0   
<0.50.0> state is 0   
<0.51.0> state is 0   
<0.43.0> state is 1   
<0.42.0> state is 1   
<0.44.0> state is 1   
<0.45.0> state is 1   
<0.46.0> state is 1   
<0.47.0> state is 1   
<0.48.0> state is 1   
<0.49.0> state is 1   
<0.50.0> state is 1   
<0.51.0> state is 1   
(node1@XXX)5> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26728564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档