1. ホーム
  2. javascript

[解決済み] 純粋関数。副作用がない」ということは「同じ入力があれば常に同じ出力が得られる」ことを意味するのか?

2023-06-01 17:26:12

質問

ある関数を定義する2つの条件とは pure は以下の通りです。

  1. 副作用がない (すなわちローカルスコープの変更のみが許可される)
  2. 同じ入力が与えられると、常に同じ出力を返す

第一条件が常に真である場合、第二条件が真でないことはあるのでしょうか?

つまり、本当に第一の条件しか必要ないのでしょうか?

どのように解決するのですか?

外側のスコープを変更しないが、それでも不純とみなされるいくつかの反例を紹介します。

  • function a() { return Date.now(); }
  • function b() { return window.globalMutableVar; }
  • function c() { return document.getElementById("myInput").value; }
  • function d() { return Math.random(); } (これは確かに PRNG を変更しますが、観測可能とはみなされません)

定数でない非ローカル変数へのアクセスは、2番目の条件に違反することができるのに十分です。

私はいつも、純粋性のための2つの条件は補完的なものだと考えています。

  • 評価結果が 効果を持つ 側の状態に
  • 評価結果は 影響を受ける サイドステートによって

この用語は 副作用 という用語は、最初の、非ローカルな状態を変更する関数のみを指します。しかし、時には読み出し操作も副作用とみなされます:読み出し操作が 操作 であり、たとえ主目的が値へのアクセスであったとしても、同様に書き込みを伴う場合です。その例としては、ジェネレーターの内部状態を変更する疑似乱数の生成、読み取り位置を前進させる入力ストリームからの読み取り、または "測定を行うコマンドを含む外部センサーからの読み取りがあります。