2014-09-05 75 views
1

我對erlang非常陌生,我只是從一本書(programming erlang)中學習。我有在這些線路有些疑惑,這是作爲一個for循環與erlang子句混淆

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] 

會有人請解釋對我來說這裏發生了什麼?

回答

3

第一個子句for(Max, Max, F)對前兩個參數使用相同的變量名。因此,只有前兩個參數相等時,該子句才匹配。這也被寫成這樣:

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

第二條要求提供的功能F,然後再進行遞歸調用自身與計數器增加。最終,這個調用將達到第一個子句,並且「循環」終止。

(但是,此功能將永遠如果I開出大於Max,例如for(2, 1, fun integer_to_list/1)終止。)

+0

謝謝你,這是一個很好的解釋。 – 2014-09-06 17:43:49

+1

讓我們安全的最簡單的方法是當I'< Max -> ...'在'I'開始大於'Max'時排除',並且生成大於'Max'一個錯誤。 – rvirding 2014-09-08 23:50:20