为什么Erlang允许在有趣之后加上括号?

Mon*_*Kin 3 erlang

这个问题是关于合作伙伴今天遇到的一些语法,虽然我们理解它是如何工作的,但我们不明白它为什么被允许(它的用途是什么?).

看看这个片段:

fun() -> ok end().
Run Code Online (Sandbox Code Playgroud)

没有最后一对括号,这将产生如下内容:

#Fun<erl_eval.20.82930912>
Run Code Online (Sandbox Code Playgroud)

但是对于它们,评估函数产生:

ok
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么Erlang允许这种语法?为什么我要创建一个函数只是立即调用它而不是只写出它的内容?它有什么实际用途吗?

我们唯一能想到的就是在乐趣的身体中引入局部变量(但这对我来说看起来很丑陋和不清楚).

请注意,这句法等是不是在二郎山不允许的,即使它遵循前者相同的概念:

fun() -> fun() -> ok end end()().  
Run Code Online (Sandbox Code Playgroud)

(这意味着:一个函数A返回一个函数B.我正在评估A(从而产生B),然后评估B得到'ok').

Nin*_*ing 9

你提到的语法是Erlang功能的自然结果.

在Erlang中,函数是值(存储为闭包).

fun() -> ok end是一个函数,它不需要任何东西并返回ok.当我们在它之后放括号时,我们正在调用该函数.另一种证明这一点的方法是:

 > F = fun() -> ok end.  
 #Fun<erl_eval.20.80484245>
 > F().                  
 ok
Run Code Online (Sandbox Code Playgroud)

您的第二个示例中的函数需要正确分组,以便解析器理解它们.

至于你的问题 - "为什么允许这种语法",我不得不说这是函数在Erlang中的自然结果.这种能力实现了编程的功能风格.这是一个例子:

 > lists:map(fun(X) -> X * 2 end, [1,2,3]).
 [2,4,6]
Run Code Online (Sandbox Code Playgroud)

上面的代码实质上是这样的:

 > [fun(X) -> X * 2 end(1), fun(X) -> X * 2 end(2), fun(X) -> X * 2 end(3)].
 [2,4,6]
Run Code Online (Sandbox Code Playgroud)

"自然结果"只是一种自然结果,它实际上不一定具有任何实际用途.所以,你可能永远不会看到像(fun() -> fun() -> ok end end())().被使用的代码:)