4

我该如何在 Erlang 中编写方法

for_loop_with_index_and_value(F, L)

这是Go中循环的模拟

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

我已经阅读了带有计数器的 foreach 循环, 但我无法重写

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)

不工作?

4

2 回答 2

3

Why you can't use lists:foldl(fun(E,Cnt) -> ..., Cnt+1 end, 0, Y).? Yes, you can:

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).

More generally foldl with index:

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 with index:

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.
于 2013-05-04T09:45:25.053 回答
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).

"_"意味着 D中的第三个参数for(I, N, _)并不重要,因此任何值都可以用作第三个参数。

于 2016-08-16T21:24:58.967 回答