2016-06-01 8 views
4

リストすることができます:foreachの関数は、コールバック関数内の要素を削除するために使用されますか?すなわち、反復が起こっているリストを変更する場合に問題があるかどうか。Erlangのリスト:foreachの副作用

答えて

6

私はこの簡単な答えはノーだと思います。

lists:foreach/2機能は、リスト内のすべての要素に特定の機能を実行するために使用されます。これに加えて、ok原子を返します。ドキュメントが定義するように、リストは返されません。

foreach(Fun, List) -> ok
コールList内の各要素ElemについてFun(Elem)。この関数は副作用に使用され、評価順序はリスト内の要素の順序と同じになるように定義されています。

すべての要素にいくつかの機能を実行し、この関数の結果を含むリストを返す場合は、lists:map/2を使用できます。けれども、foreachとは対照的に、mapは、任意の評価の順序を保証するものではないことに注意してください。あなただけのリストから要素を削除したい場合は

だけlists:delete/2を使用しています。

+1

感謝。私は変数がerlangで不変であることを忘れていました。 **副作用**はドキュメントでは何を意味しますか。ドキュメンテーションは誰の副作用ですか? –

+2

私は、副作用は何も返されないことを意味しています。戻り値を気にすることなく、リスト内のすべての要素に対して何かを実行するだけでした。たとえば、 'List'のすべての要素を' Pid'プロセスで送信したい場合は、 'foreach(fun(E) - > Pid!E end、List)'リストを実行できます。 –

+0

https://en.wikipedia.org/wiki/Side_effect_%28computer_science%29 – Amiramix