这个问题是关于合作伙伴今天遇到的一些语法,虽然我们了解它是如何工作的,但我们不明白它为什么被允许(它的用途是什么?)。
请看这个片段:
fun() -> ok end().
如果没有最后一对括号,这将产生类似:
#Fun<erl_eval.20.82930912>
但是对于他们,评估函数产生:
ok
我的问题是,为什么Erlang允许这种语法?为什么我要创建一个函数只是立即调用它而不是只写出它的内容?它有什么实际用途吗?
我们唯一可以考虑的是在乐趣的身体中引入局部变量(但这对我来说看起来很丑陋而且不清楚。)
请注意,Erlang中允许使用其他语法 ,即使它遵循前者的相同概念:
fun() -> fun() -> ok end end()().
(这意味着:函数A返回一个函数B.我正在评估A(从而生成B),然后评估B得到'ok'
)。
答案 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()) ()
。