質問
foldlから脱却する必要があります。リスト内の値の合計をカウントし、大きすぎる値を満たしているときに、折りたたみから壊れる方法があります(つまり、10)
L = [1,2,3,4,10,5,6,7],
Res =
try
lists:foldl(
fun(I, Value) ->
if (I < 10) ->
Value + I;
true ->
throw({too_big_value, Value})
end
end,
0, L)
catch
throw:{too_big_value, Value} -> Value
end,
Res.
この例は人工的なものであることは知っていますが、折り畳むのに良い方法はありますか(フォールドは常に構造全体をスキャンすることを知っています)?
折りたたまれた場合でも、正しいデータを取得する必要があることに注意してください。この場合、以前のイテレーションからデータを取得する必要があります(私の例で行われたように)。
解決
非ローカルリターンのためにトライ/キャッチでスローを使用して、あなたはそれを正しくやっています。関数が、継続するかどうかを決定するために楽しみからの返品値を調べた場合、それはもう折り畳まれません。
他のヒント
ちょうど興味があり、使用するポイントは何ですか 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))
所属していません StackOverflow