与erlang条款混淆

时间:2014-09-05 11:52:54

标签: erlang

我对二郎非常新,我只是从一本书中学习(programming erlang)。我在这些行中有一些疑问,这些行用作 for loop

lib_misc.erl:

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

然后这样做:

1> lib_misc:for(1,10,fun(I) -> I end).
[1,2,3,4,5,6,7,8,9,10]

有人请告诉我这里发生了什么事吗?

1 个答案:

答案 0 :(得分:3)

第一个子句for(Max, Max, F)对前两个参数使用相同的变量名。因此,此子句仅在前两个参数相等时匹配。这也可以这样写:

for(I, Max, F) when I =:= Max -> ...

第二个子句调用提供的函数F,然后在计数器增加的情况下对自身进行递归调用。最终,此调用将到达第一个子句,“循环”终止。

(但是,如果I的值大于Max,则此函数将永不终止,例如for(2, 1, fun integer_to_list/1)。)