2013-05-04 43 views
4

怎能我寫在二郎寫for循環二郎

for_loop_with_index_and_value(F, L) 

的方法,它是

for index, value := range array { 
    F(index, value) 
} 

我已閱讀foreach loop with counter 但我不能重寫循環中去模擬

lists:foldl(fun(E,Cnt) -> ..., Cnt+1 end, 0, Y) 

這樣F就不會返回下一個索引。

好的,非常感謝大家。爲什麼

for_loop_with_index_and_value(fun(I, V) -> calc(I, V) end, L) 

工作,但

for_loop_with_index_and_value(fun calc/2, L) 

不起作用?

+3

[This answer](http://stackoverflow.com/a/4777367/149530)似乎符合您的要求。 – 2013-05-04 07:12:10

回答

3

爲什麼不能使用lists:foldl(fun(E,Cnt) -> ..., Cnt+1 end, 0, Y).?是的,你可以:

for_loop_with_index_and_value(F, L) when is_function(F, 2), is_list(L) -> 
    lists:foldl(fun(E, I) -> F(I, E), I+1 end, 0, L). 

更一般foldl搭配指數:

foldli(F, L, Acc0) when is_function(F, 3), is_list(L) -> 
    {_, Result} = lists:foldl(fun(E, {I, Acc}) -> {I+1, F(I, E, Acc)} end, {0, Acc0}, L), 
    Result. 

map搭配指數:

mapi(F, L) when is_function(F, 2), is_list(L) -> 
    {Result, _} = lists:mapfoldl(fun(E, I) -> {F(I, E), I+1} end, 0, L), 
    Result. 
1

您可以如下編寫一個遞歸函數。

* I: index 
* N: max_value 
* D: increment 

-export([start/0]). 

for(I, N, _) when I == N -> 1; 

    for(I, N, D) when I < N -> 
     io:fwrite("~w~n", [I]), //function body do what ever you want!!! 
     for(I+D, N, D). 
start() -> 
for(0, 4, 2). 

第三個參數"_"for(I, N, _)裝置d是不重要的,所以任何值可以被用作第三個參數。