1. サブルーチン(プロシージャ、手続き型)
- 説明: 一般的に「処理のまとまり」として用いられ、引数を受け取って処理を実行します。
- 副作用: 状態を変更したり、外部の世界に影響を与えることがあります。
- 特徴:
- 副作用(状態変更、I/O操作など)を持つことが多い。
- 結果を返さないことが多いが、返り値を持つこともある。
例:
def print_hello():
print("Hello, World!") # 画面に出力という副作用
2. 純粋関数(ピュア関数、関数型)
- 説明: 引数が同じであれば常に同じ結果を返す関数です。副作用を持たず、状態を変更しません。
- 副作用: なし
- 特徴:
- 引数を使って計算を行い、その結果を返すのみ。
- 外部の変数や状態に依存しない。
- 参照透過性を持つ。
例:
def add(a, b):
return a + b # 副作用なし
3. 写像(マッピング)
- 説明: 数学的には、写像は「入力を出力に対応させる関数」のことを指します。プログラミングにおいても、入力値を特定の方法で処理して出力を生成する関数として使われます。
- 副作用: なし(純粋関数としての写像)
- 特徴:
- ある集合(ドメイン)から別の集合(コドメイン)への対応関係を定義。
- 関数が与えられた入力に対して必ず一つの出力を返すという特性を持つ。
- より抽象的な操作として、データの変換、フィルタリング、リストのマッピングなどでよく利用されます。
例:
def square(x):
return x * x # xを入力としてその2乗を返す写像
主な違い
- 副作用: サブルーチンは副作用を持つことが多いが、純粋関数は副作用がない。
- 状態の変更: サブルーチンは内部の状態や外部の状態を変更することがあるが、純粋関数は状態を変更しない。
- 可再利用性とテスト: 純粋関数はテストしやすく、並列化やキャッシュが容易になるなど、関数型プログラミングにおいて重要。
純粋関数は計算やデータ変換に特化しており、サブルーチンは手続き的な処理に使われます。