Erlang:调用返回的函数时没有将其分配给任何变量时出错

时间:2013-10-22 19:02:13

标签: erlang

我正在尝试一些erlang代码,我不知道为什么我们必须在某些地方用括号括起代码才能工作,而在其他地方它也没有括号。是由于运算符优先级(非常不可能),还是由于声明而不是表达式? Erlang新手在这里。请参阅下面的示例。

%% Example from the Programming Erlang book.
-module(lib_misc).
-export([for/3]).

for(Max, Max, F) -> [F(Max)];
for(I, Max, F)   -> [F(I)|for(I+1, Max, F)].

我使用上面的函数生成函数列表

lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end) end).

给出像

这样的东西
[#Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>,
 #Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>,
 #Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>,
 #Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>,
 #Fun<erl_eval.20.82930912>,#Fun<erl_eval.20.82930912>]

接下来我尝试立即调用函数来获取计算结果,三个不同的变体产生相同的结果并将其分配给变量L

L = lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end) end).

lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end ()) end).     %% [2,4,6,8,10,12,14,16,18,20]
lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end)() end).      %% [2,4,6,8,10,12,14,16,18,20]
lib_misc:for(1, 10, fun (X) -> fun () -> 2*X end() end).        %% [2,4,6,8,10,12,14,16,18,20]

问题出在我打电话

lists:nth(3, L)().

,它给出了错误* 1: syntax error before: '('。为什么这不给6lists:nth()是一个函数,在这种情况下返回另一个函数。究竟是什么导致了这个问题呢? 在括号中包装语句会给出预期的结果,但为什么会这样呢?

(lists:nth(3, L))().  %% 6

同样,将返回值赋给变量并调用它也可以,但这很明显。

-module(test).
-export([l/0, t/0]).

l() -> lib_misc:for(1, 10, fun (X) -> (fun () -> 2*X end) end).
%% t() -> lists:nth(3, l())(). %% test.erl:5: syntax error before: '('
t() -> lists:nth(3, l()).      %% works. 

如果问题出在语句表达式的东西上,在这段代码中fun (X) -> fun () -> 2*X end() end是内部匿名函数,是一个语句还是一个表达式?

感谢。

1 个答案:

答案 0 :(得分:3)

这只是Erlang语法中优先规则的影响。 (并且Erlang中没有语句,只有表达式。)