为什么Erlang允许在娱乐之后加括号?

为什么Erlang允许在娱乐之后加括号?,erlang,Erlang,这个问题是关于一个合作伙伴今天遇到的一些语法,虽然我们理解它是如何工作的,但我们不理解为什么允许它(它有什么用途?) 请看这个片段: fun() -> ok end(). 如果没有最后一对括号,这将产生如下结果: #Fun<erl_eval.20.82930912> 我的问题是,为什么Erlang中允许这种语法?为什么我要创建一个函数来立即调用它,而不是仅仅写出它的内容?它有什么实际用途吗 我们能想到的唯一一件事就是将局部变量引入到游戏的身体中(但这在我看来既难看又不清楚)

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

请看这个片段:

fun() -> ok end().
如果没有最后一对括号,这将产生如下结果:

#Fun<erl_eval.20.82930912>
我的问题是,为什么Erlang中允许这种语法?为什么我要创建一个函数来立即调用它,而不是仅仅写出它的内容?它有什么实际用途吗

我们能想到的唯一一件事就是将局部变量引入到游戏的身体中(但这在我看来既难看又不清楚)

请注意,其他语法在Erlang中是不允许的,尽管它遵循与前者相同的概念:

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

(这意味着:一个函数a返回一个函数B。我先计算a(从而产生B),然后计算B以得到
“ok”
)。

通常,语法
fun()->ok end()
没有太多用处。但是做一些类似于
(find_right_fun())()
的事情会很有用,这基本上是一样的——一个计算结果为函数的表达式


请注意,Erlang解析器要求您使用()指定优先级,以整理()()的含义,即您的第二个示例应该是
(fun()->fun()->ok end())()

您提到的语法是Erlang功能化的自然结果

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

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

 > F = fun() -> ok end.  
 #Fun<erl_eval.20.80484245>
 > F().                  
 ok
上述准则实质上是:

 > [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())()这样的代码。
正在使用:)

我不知道Erlang,但是(我认为)函数是一流的对象。这意味着它们可以是函数的参数,可以分配给变量,甚至可以是返回值本身。当你做一些像是通过定制函数排序的事情时,它非常有用。看看最后一个,你可能错了。至少我的erlang版本可以使用这个
fun()->fun()->ok end()end()。
我的意思是这个语句是正确的。@rogaos是的,它们是erlang中的第一类对象。但是为什么不允许使用第二种语法呢?(乐趣回归乐趣)。@ipinak注意到我的版本的第二个
end
末尾是如何放置两对括号的。@DWilches我真的不明白你的回答。
 > 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]