gpt4 book ai didi

erlang - 设计模式?遍历列表以搜索第一个 {success} 结果的函数

转载 作者:行者123 更新时间:2023-12-04 17:41:16 24 4
gpt4 key购买 nike

我在 Erlang 中遇到了一个编码问题,这可能是一种常见的设计模式,但我找不到有关如何解决它的任何信息。

我有一个列表 L。我想对 L 中的每个元素应用一个函数 f,并让它同时运行在 L 中的所有元素上。每次调用 f(Element) 要么成功,要么失败;在大多数情况下它会失败,但偶尔它会为 L 中的特定元素成功。

如果/当 f(Element) 成功时,我想返回“成功”终止对 L 中其他元素的所有 f 调用 - 第一个“成功”是我感兴趣的。另一方面,如果 f(Element) 对 L 中的每个元素都失败,那么我想返回“失败”。

作为一个简单的例子,假设 L 是一个整数列表,如果 L 中的一个元素是 3,则 F 返回 {success},或者为任何其他值返回 {fail}。我想尽快找到L中是否有3s;我不在乎有多少个 3,只关心是否至少存在一个 3。 f 看起来像这样:

f(Int) ->
case Int of
3 -> {success};
_ -> {fail}
end.

如何遍历 Int 列表以找出该列表是否至少包含一个 3,并尽快返回?

当然,这是一种常见的功能设计模式,我只是没有在 Google 中使用正确的搜索词...

最佳答案

基本上有两种不同的方法可以做到这一点。要么编写自己的函数,该函数遍历返回的列表 truefalse取决于它是否找到 3:

contains_3([3|_]) -> true;
contains_3([_|T]) -> contains_3(T);
contains_3([]) -> false.

第二种是使用一个已经定义的函数来进行实际迭代,直到对列表元素的测试为真并为其提供测试。 lists:any返回 truefalse取决于至少一项元素的测试是否成功:
contains_3(List) -> lists:any(fun (E) -> E =:= 3 end, List).

会做同样的事情。您选择哪个取决于您。第二个可能更接近于设计模式,但我觉得即使你使用它,你也应该了解它在内部是如何工作的。在这种情况下,它是微不足道的并且非常接近显式情况。

这是很常见的事情,但我不知道它是否会归类为设计模式。它看起来非常基本而且在某种意义上“微不足道”,我会犹豫是否将其称为设计模式。

关于erlang - 设计模式?遍历列表以搜索第一个 {success} 结果的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3286020/

24 4 0