Простой способ сломать складку - PullRequest
6 голосов
/ 07 декабря 2011

Мне нужно оторваться от фолдла.Вот фиктивный пример, как выйти из сгиба, когда я считаю сумму значений в списке и встречаю слишком большое значение (т. Е. 10)Свернуть сгиб (я знаю, что сгиб всегда сканирует всю структуру)?

Обратите внимание, что мне нужно получить правильные данные, даже если я сорвусь со сгиба.В этом случае я должен получить данные из предыдущей итерации (как это было сделано в моем примере).

Ответы [ 2 ]

8 голосов
/ 08 декабря 2011

Просто любопытно, какой смысл использовать foldl здесь?Если вам нужно прорваться, используйте рекурсию, foldl не предназначена для нее.

main([]) ->
  L = [1,2,3,4,5,10,6,7],

   io:format("[~w]", [s(L, 0)]).

s([], S) ->
  S;

s([H|T], S) ->
  if (H < 10) ->
    s(T, S + H);
  true ->
    S
  end.

Обновление:

Другой вариант - использовать takewhile:

lists:foldl(fun(E, A) -> A + E end, 0, lists:takewhile(fun(E) -> E < 10 end, L))
7 голосов
/ 07 декабря 2011

Вы делаете все правильно, используя throw с try / catch для нелокального возврата.Если бы функция смотрела на возвращаемое значение из забавы, чтобы решить, продолжать или нет, оно больше не будет сброшено.

...