Erlang列表:foreach副作用

4
lists:foreach函数在回调函数中可以用来删除元素吗?即是否会对正在迭代的列表进行修改而导致问题?
1个回答

5
我猜这个简单的答案是否定的。 lists:foreach/2 函数用于在列表中的所有元素上运行特定函数。除此之外,它返回 ok 原子。根据文档定义,它不返回列表。

foreach(Fun, List) -> ok
对于列表 List 中的每个元素 Elem,调用 Fun(Elem)。该函数用于其副作用,而且计算顺序与列表中元素的顺序相同。

如果您想对每个元素执行某些函数并返回包含来自该函数结果的列表,则可以使用 lists:map/2。尽管如此,请注意,与 foreach 不同,map 不保证任何计算顺序。
如果您只想从列表中删除一个元素,只需使用 lists:delete/2

1
谢谢。我忘记了 Erlang 中的变量是不可变的。但是文档中的“副作用”是什么意思?文档指的是哪些副作用? - Talespin_Kit
2
我猜副作用是指一个函数不返回任何东西,而只是运行列表中的每个元素,而不关心它的返回值。例如,如果你想要将Pid这个进程发送到List中的所有元素,可以使用lists: foreach(fun(E)-> Pid!E end,List) - A. Sarid
2
注意使foreach适用于具有副作用的函数的特定属性是保证将函数应用于列表元素后遵循列表顺序。尽管您也可以使用map并忽略结果,但在理论上,map不保证任何评估顺序(因为对于纯函数,评估顺序无关紧要) - Samuel Rivas
谢谢@SamuelRivas,你说得完全正确,我已经在我的答案中添加了这个注释。 - A. Sarid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接