【じゅんすいかんすう】

純粋関数 とは?

最終更新:
💡 同じ材料なら必ず同じ料理が出てくる「正直な自動販売機」
📌 このページのポイント
純粋関数 vs 非純粋関数 純粋関数 入力 A f(x) f(x) 同じ入力 → 常に同じ出力 ✓ 外部状態を読まない ✓ 外部状態を変えない ✓ テスト・予測が容易 非純粋関数 入力 A g(x) 副作用 同じ入力でも結果が変わる × DB・ファイルに書き込む × グローバル変数を変更 副作用がない関数は予測・テストしやすい
純粋関数と非純粋関数の比較イメージ
ひよこ ひよこ
純粋じゃない関数ってどんなもの?
ペンギン先生 ペンギン先生
たとえば関数の中でグローバル変数を変更したり、Math.random() で毎回違う値を返したり、APIにデータを送信したりする関数。これらは「同じ入力でも結果が変わる」か「外部に影響を与える」ので純粋ではない。
ひよこ ひよこ
全部純粋関数にすればいいんじゃないの?
ペンギン先生 ペンギン先生
現実のアプリにはAPIの呼び出し、画面の描画、ファイルの読み書きなど副作用が必要な場面がある。大事なのは「純粋な部分」と「副作用がある部分」を明確に分けること。ビジネスロジックを純粋関数にすると保守しやすい。
ひよこ ひよこ
Reactと純粋関数ってどう関係あるの?
ペンギン先生 ペンギン先生
Reactコンポーネントは「propsを受け取ってJSXを返す純粋関数」が理想。副作用が必要な処理(API呼び出し、タイマー設定など)は useEffect に分離する。こうすることで描画ロジックが予測しやすくなる。
ひよこ ひよこ
純粋関数だとテストが簡単って本当?
ペンギン先生 ペンギン先生
本当だよ。純粋関数は「同じ入力→同じ出力」だからテストが単純な入出力の確認になる。モックも不要だし、テストの順序も関係ない。非純粋関数だとDBやAPIの状態に依存するからテストの準備・片付けが大変になるんだ。
ひよこ ひよこ
関数型プログラミングって全部純粋関数で書くの?
ペンギン先生 ペンギン先生
Haskellのような純粋関数型言語ではそれに近いことをするよ。副作用はモナドという特殊な仕組みで隔離するんだ。ただし現実のアプリ開発では100%純粋にするのは難しいから、「できるだけ純粋に書いて、副作用は端に追いやる」というアプローチが実用的。関数型プログラミングの知見は命令型言語でも大いに役立つよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
純粋関数って出てきたら「同じ入力なら必ず同じ出力で、外に影響しない関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「pure function」 = 純粋な関数
💬 pure は「混じり気のない」という意味で、副作用という「不純物」がない関数のこと
← 用語集にもどる