Articles

純粋な関数とは何ですか?

利点

純粋な関数を使用することには、パフォーマンスと使いやすさの両方の点でいくつかの利点があります。

可読性

純粋な関数は、読みやすく、推論する方がはるかに簡単です。 関連するすべての入力と依存関係はパラメータとして提供されるため、入力のセットの外側で変数を変更する効果は観察されません。

これは、関数の宣言を読むだけで、関数とその依存関係をすばやく理解できることを意味します。 したがって、関数がf(a, b, c)abcfの依存関係であることがわかります。

移植性

すべての依存関係は入力パラメータとして提供され、グローバルコンテキストを介してアクセスされないため、これらの依存関係は、関

これは、同じ関数が同じリソースの異なる実装で動作できることを意味します。

これにより、同じクラスの異なる実装を使用するためだけに別の関数を記述するのではなく、同じ関数をさまざまなコンテキストで使用できる

たとえば、グローバルに格納されている二つの異なるロガーを使用するために二つの異なる不純な関数を記述する代わりに、純粋な関数は、所望のロ

Testing

副作用の欠如は、入力が目的の出力を生成することをテストするだけであるため、pure関数をテストするのが非常に簡単になります。 特定の関数のテストでは、グローバルプログラムの状態の有効性をチェックする必要はありません。また、すべての依存関係が入力として提供されるため、依存関係を簡単にモックできます。 不純な設定では、すべてのテストでグローバル依存関係の状態を追跡する必要があります。しかし、純粋な設定では、すべての依存関係を入力として提供するだけです。 テスト全体を通してグローバルな状態を維持することを心配する必要はなくなり、異なるテストに異なるバージョンの依存関係を提供できるようになりました。

これにより、各テストで提供された依存関係を明示的に制御しながら、関数をテストすることができます。

参照透過性

参照透過性は、プログラムの動作を変更せずに、関数の呼び出しを対応する出力値に置き換えることができることを指します。

参照透過性を実現するには、関数は純粋でなければなりません。 これに可読性および速度の点では利点がある。 コンパイラは、参照透過性を示すコードを最適化することができます。

Caching

純粋な関数は常に同じ入力に対して同じ出力を返すので、純粋な関数呼び出しの結果をキャッシュすることができます。

キャッシュとは、メモ化などの手法を使用して関数の結果を格納し、一度だけ計算する必要があるようにすることを指します。通常、関数f: Input -> Output Input -> Outputからのマップ(ハッシュマップなど)を介して達成されます。

関数を実行するときは、まずマップに入力がキーとして含まれているかどうかを確認します。 そうでない場合は、f(input)を計算してから、出力をマップに保存してから返します。