2

すべての純粋関数は冪等ですか?

公式のAngular.js チュートリアルでこのステートメントを見ていなければ、私はそのようなクレイジーな質問をしませんでした:

フィルター関数は純粋な関数である必要があります。つまり、ステートレスでべき等である必要があります。Angular はこれらのプロパティに依存し、関数への入力が変更された場合にのみフィルターを実行します。

これは、純粋関数はステートレスかつ冪等でなければならないことを暗示しているように思われますが、これは純粋関数の一般的な定義とは一致しません。

実際、これはページ内の以下の例とは一致しません。ここでは、文字列内の文字を逆にすることがフィルターの例として示されています。もう一度。

さらに興味深いことに、そのチュートリアルでリンクされている純粋な関数のウィキペディアのページを見ると (私は新しいユーザーなので、リンクを 1 つしか投稿できません。申し訳ありません...): sin ( x ) が a の例として報告されます。純粋関数。

Angular.js によると、正弦は冪等性ですよね?

私は何が欠けていますか?

4

1 に答える 1

2

元の答えを破棄します。答えはno のようです。コメントを参照してください。

純粋な関数が を返すf(f(x)) === f(x)場合のみ。これは、関数が何も返さない場合にのみ当てはまります。与えられた良い例はdouble(x)であり、それはちょっと明白ですdouble(double(x)) !== double(x)


はい。純粋関数は常に冪等です。ただし、純粋な関数の定義を考えると、冪等の性質について議論することはあまり意味がありません。

純関数は次の 2 つの基準を満たしています。

  • 決定論、つまり、関数は、同一の入力が与えられた場合に同一の出力をもたらします。
  • 副作用はありません。つまり、関数は内部スコープの状態を変更するだけです。

冪等性とは、関数が呼び出された回数に関係なく、システム状態を最初の呼び出し後と同じ状態に変更する関数の品質です。

たとえば、銀行が を使用して銀行のトランザクション処理システムによって処理される ID x のトランザクションを持っている場合、function processTransaction(id)システムが処理する回数に関係なく、トランザクションを反映するためにシステムの状態を 1 回だけ変更する必要があります。それ (たとえば、誤って 2 回呼び出された場合)。

したがって、純粋な関数がシステムの状態に影響を与えない (副作用がない) 場合、常にシステムの状態に影響を与えることはありません。したがって、何回呼び出されても、最初の呼び出しと同じ状態に状態が変化するため、べき等です。明確にするために、その最初の呼び出しもシステム状態を変更しません。

純粋ではない関数で純粋関数の結果を処理すると、この品質が失われる可能性があります。

于 2017-10-24T10:47:44.863 に答える