副作用のない関数(Pure Function)

関数型プログラミングにおける**「副作用のない関数(Pure Function)」**は、関数型プログラミングの核心的な概念の一つであり、予測可能性、テストの容易さ、並行性の安全性などの利点をもたらします。


副作用のない関数(Pure Function)とは何か

副作用のない関数とは、次の2つの条件を満たす関数のことです:

  1. 同じ入力には常に同じ出力を返すこと(決定性/参照透明性)

  2. 関数の外部状態に影響を与えないこと(副作用を持たない)


条件1:同じ入力から同じ出力が得られる

これは「**決定性(deterministic)」または「**参照透明性(referential transparency)」とも呼ばれます。たとえば:

haskell
add x y = x + y

この関数 add は常に同じ xy に対して同じ結果を返します。計算結果は外部状態に依存しません。


条件2:副作用がない

副作用とは以下のような外部状態の変化や依存を指します:

  • グローバル変数の変更

  • ファイルやデータベースへの書き込み

  • 標準出力への表示(print など)

  • ユーザー入力の取得(readLine など)

  • 現在時刻の取得

  • 乱数の生成(非決定的な値)

副作用のある関数の例(純粋ではない):

javascript
let count = 0; function increment() { count += 1; // グローバル変数の変更 → 副作用 return count; }

純粋な関数の例:

javascript
function add(a, b) { return a + b; // 外部状態に依存せず、影響も与えない }

副作用のない関数の利点

  1. テストが容易
    同じ入力に対して同じ出力が得られるため、ユニットテストが簡単になる。

  2. デバッグと理解が容易
    外部の状態に依存しないので、関数単体の挙動を理解しやすい。

  3. 並行処理と並列処理が安全
    副作用がないため、スレッド間の状態競合が発生しにくい。

  4. リファクタリングが安全
    純粋関数は他の部分に影響を与えないため、再利用や修正が容易。


関数型言語と副作用の扱い

関数型言語(Haskell、Elm、F# など)では、**副作用を制御された形で扱う構文(例:モナド)**が提供されています。副作用を分離することで、プログラム全体の予測可能性と安全性が高まります。


結論

副作用のない関数は、関数型プログラミングの基本理念である宣言的スタイル、予測可能性、再利用性の向上を支える重要な概念です。すべての処理を純粋な関数で記述することは現実的ではない場面もありますが、可能な限り純粋性を保つことが、堅牢で保守性の高いコードの鍵となります。

生成日:2025/06/01