在Erlang中编写for循环

时间:2013-05-04 06:01:34

标签: erlang

如何在Erlang中编写方法

for_loop_with_index_and_value(F, L)

是Go

中的循环模拟
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)

不起作用?

2 个答案:

答案 0 :(得分: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 :(得分: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).

"_"中的第3个参数for(I, N, _)表示D不重要,因此任何值都可以用作第3个参数。