TL;DR
同じ引数に対して常に同じ値を返し、副作用を持たない関数。関数型プログラミングの基本要素である。
なぜ必要か
出力が入力だけで決まるので、扱いやすい。Wikipedia では、次の利点を挙げている。
- 参照透過性: 同じ入力には同じ出力が返るので、関数の呼び出しをその結果で置き換えられる
- メモ化: 結果を表に保存して再利用できる
- 単体テスト: 出力が入力だけで決まるので、テストしやすい
- コンパイラの最適化: 共通部分式の削除やループの最適化ができる
仕組み
純粋関数は、次の 2 つの性質を持つ。
- 同じ引数に対して、常に同じ値を返す。出力は入力だけで決まる
- 副作用を持たない。グローバル変数、参照で渡された引数、入出力のストリームなどの外部の状態を変えない
例
C++ の floor や max は純粋関数である。一方、静的変数やグローバル変数を読む関数、標準入力から読む関数は、同じ引数でも値が変わりうるので純粋ではない。グローバル変数を書き換える関数や、標準出力に書く関数も、副作用があるので純粋ではない。
React では、コンポーネントと React Hooks は純粋関数であるべきだとされている。Nix は、ビルドとデプロイのプロセスを純粋関数として扱う発想で開発されたパッケージマネージャである。