【じゅんすいかんすう】

純粋関数 とは?

💡 同じ材料なら必ず同じ料理が出てくる「正直な自動販売機」
📌 このページのポイント
純粋関数 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 は「混じり気のない」という意味で、副作用という「不純物」がない関数のこと
← 用語集にもどる