如何在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)
不起作用?
答案 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个参数。