我有一个Erlang中的元素列表,我使用的是列表:foreach遍历列表中的元素。有没有办法在遍历过程中突破这个“foreach循环”。例如:假设我想在列表中遇到'1'[2,4,5,1,2,5],我会停止进一步遍历列表。我该怎么做呢?Erlang:打破列表:foreach“循环”
回答
traverse(Liste) ->
traverse(Liste, []).
traverse([], Acc) ->
Acc;
traverse([1|_], Acc) ->
Acc;
traverse([H|T], Acc) ->
% do something useful here maybe?
traverse(T, Acc).
当然,这是非常粗糙例子。
另一种方法是使用throw
和catch
:
catch lists:foreach(
fun(1) ->
throw(found_one);
(X) ->
io:format("~p~n", [X])
end,
[2, 4, 5, 1, 2, 5]).
当在shell中运行,这种输出:
2
4
5
found_one
编辑:应广大用户要求,更精确版本只捕捉你想要捕捉的内容:
try lists:foreach(
fun(1) ->
throw(found_one);
(X) ->
io:format("~p~n", [X])
end,
[2, 4, 5, 1, 2, 5])
catch
throw:found_one ->
found_one
end.
使用异常抛出应该是来自函数的“非本地返回”。在这个答案中的用法是有效的投掷使用,我不明白为什么它被低估了。 – 2009-11-30 17:27:04
在Python社区有一句话“这个解决方案不是很* Pythonic *”。在Erlang社区中是否有等价的表达式? ;-) – jldupont 2009-11-30 17:36:01
例外应该用来表示特殊的条件,而不是用于流量控制 – 2009-11-30 17:47:02
有在lists模块许多不错的功能:
lists:foreach(fun(E) -> do_something(E) end,
lists:takewhile(fun(E) -> E =/= 1 end, List)).
或更有效,但不太好的
lists:takewhile(fun(1) -> false;
(E) -> do_something(E), true
end, List)
我需要停止处理列表furthur当我遇到1,而不是只是跳过1. – ErJab 2010-11-11 19:27:43
@ErJab:所以RTFM http://erlang.org/doc/man/lists.html#takewhile-2它不是http://erlang.org/doc/man/lists.html#filter-2你认为它的工作方式如何?继续处理列表的其余部分只是为了好玩? – 2010-11-13 08:18:28
我遇到了同样的问题,并通过这种方式解决它:
-module(foreach_until).
-export([foreach_until/3]).
foreach_until(Action, L, Judge) ->
lists:reverse(foreach_until(Action, L, Judge, []))
.
foreach_until(_, [], _, Result) ->
Result
;
foreach_until(Action, [H | T], Judge, Result) ->
case Judge(H) of
true -> Result;
false -> foreach_until(Action, T, Judge, [Action(H) | Result])
end
.
下面是一个解释如何使用的例子:
60> foreach_until:foreach_until(fun(X) -> X*X end, [1,2,3,4], fun(X)-> X >= 3 end).
[1,4]
列表:全部?
do_something(A) ->
case A of
1 ->
false;
_ ->
true
end.
IsCompleted = lists:all(do_something(A), [2, 4, 5, 1, 2, 5]),
将爆发每当do_something返回false和IsCompleted返回结果。
- 1. 打破foreach循环
- 2. 打破foreach循环3
- 3. 打破foreach循环php
- 4. 从foreach循环中打破
- 5. 在foreach循环中打破setTimeout函数
- 6. 如何在JavaScript中打破foreach循环?
- 7. 如何打破多个foreach循环?
- 8. 如何打破xtend中的foreach循环?
- 9. 打破循环
- 10. 打破循环
- 11. 打破内部的foreach循环,并继续外部的foreach循环
- 12. 国家列表:Foreach循环
- 13. 列表框foreach循环
- 14. getElementById()打破循环
- 15. F#:打破循环
- 16. 打破jQuery循环
- 17. PHP打破循环
- 18. 打破了循环
- 19. 阵列Foreach循环
- 20. 从循环外部打破循环
- 21. Scala列表foreach,在foreach循环中更新列表
- 22. 在Jython中打破循环
- 23. 打破我的while循环
- 24. 打破无限循环
- 25. C++打破循环包括
- 26. 打破嵌套循环
- 27. 打破while循环功能?
- 28. SQL Server 2000 - 打破循环
- 29. 在Python中打破循环
- 30. 打破PrototypeJS .each()循环
是的,我经常发现理解像列表这样的东西比较容易:foreach工作,然后编写自己的版本以满足特殊情况。正如你在上面看到的那样,代码的行数是微不足道的。浏览列表模块的源代码将对Erlang语言及其使用产生深入的了解... – 2009-11-30 15:04:47
我的观点也是:一旦您对Erlang感到满意,这种表现力的确会产生奇迹。 – jldupont 2009-11-30 15:20:30
我不知道这是否返回除[]之外的任何东西(不包括没有匹配的函数子句:o)) – Zed 2009-11-30 17:26:27