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

时间:2013-09-12 21:15:31

标签: erlang

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

请看这个片段:

fun() -> ok end().

如果没有最后一对括号,这将产生类似:

#Fun<erl_eval.20.82930912>

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

ok

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

我们唯一可以考虑的是在乐趣的身体中引入局部变量(但这对我来说看起来很丑陋而且不清楚。)

请注意,Erlang中允许使用其他语法 ,即使它遵循前者的相同概念:

fun() -> fun() -> ok end end()().  

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

2 个答案:

答案 0 :(得分:9)

您提到的语法是Erlang正常运行的自然结果。

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

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

 > F = fun() -> ok end.  
 #Fun<erl_eval.20.80484245>
 > F().                  
 ok

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

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

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

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

 > [fun(X) -> X * 2 end(1), fun(X) -> X * 2 end(2), fun(X) -> X * 2 end(3)].
 [2,4,6]

“自然结果”只是一种自然结果,它实际上不一定具有任何实际用途。因此,您可能永远不会看到使用(fun() -> fun() -> ok end end())().之类的代码:)

答案 1 :(得分:2)

您通常对语法fun() -> ok end ()没有多大用处。但是做(find_right_fun()) ()之类的事情会很有用,这基本上是一回事 - 一个评估函数的表达式。

请注意,Erlang解析器要求您指定优先级,使用()来排序()()的含义,即您的第二个示例应为(fun() -> fun() -> ok end end()) ()