参照透過性
参照透過性(Referential transparency)
式を、式の計算結果の値と差し替えても動作が変わらないことを、参照透過性があるという。 同じ入力であれば、同じ出力が必ず得られること、副作用を持たないことが保証される。 参照等価性を満たす関数を純粋関数と呼ぶ。
参照等価性を満たすと、以下のようなメリットがある。
事前に計算しておける。(コンパイル時最適化)
計算結果を保存して再利用できる。(メモ化)
安全に実行順序を入れ替えられる。
安全に並列実行できる。
内部的な状態変化を持たないため、プログラムの見通しが良くなる。
これは、一面では便利であるものの、オブジェクトに対して「代入」「変更」を行うことができないことを意味している。
代入や変更ができないと不便であるため、結局そのような機能を後付けすることになったりする。
例えば Haskell では RealWorld という状態モナド(イミュータブル(変更不能)なオブジェクトのようなもの)を持ち、異なる状態を出力として随時作り出しながら進行していく。
新たなオブジェクトは変化部分を持ち、変化していない部分は元のオブジェクトを参照する、という形で、理論的には変更を最小のコストで保持することができる。
Haskell の do は、連続する式の実行順序を固定する。
メモ