Стандартный способ увеличения счетчика такой же, как в первом примере. Добавляя переменную к вызову и увеличивая ее. Я думаю, что вас смущает отсутствие циклов for и возможность обновления значений.
Обратите внимание, что:
repeat(Times) when Times >= 0 -> repeat(0, Times).
repeat(Times, Times) -> done;
repeat(N, Times) ->
do_a_side_effect,
repeat(N + 1, Times).
компилируется (более или менее) так же, как (в псевдокоде):
repeat(Times) ->
while (N < Times) {
do_a_side_effect
N++
}
return done
Если вы хотите накапливать результат, есть и способы сделать это.
Либо используйте пакет списков, либо накапливайте результат самостоятельно:
loop(File) ->
{ok, Fd} = file:open(File),
loop(Fd, 0, []).
loop(Fd, Count, Acc) ->
case file:read(Fd, 80) of
{ok, Line} ->
Result = do_something(Line, Count),
loop(Fd, Count + 1, [Result | Acc]);
eof ->
file:close(File),
{Count, lists:reverse(Acc)};
{error, Reason} -> {error, Reason}
end.
Или что-то похожее на основе вашего примера.
Редактировать: возвращаемое значение Count также является частью возвращаемого значения, поскольку оно представляется важным.