【さんしょうとうかせい】

参照透過性 とは?

最終更新:
💡 計算を答えに置き換えても、意味は同じ

式をその評価結果の値に置き換えても、プログラムの意味が変わらない性質。純粋な計算では、同じ入力に対して同じ結果が得られ、外部への変更や入出力に依存しない。

📌 このページのポイント
式を答えに置き換えても同じ? 外部を変更しない足し算の例add(2, 3) + 15 + 1置き換えても、どちらも6ログを書いて5を返す式なら?log(); 55ログ記録が残る記録が消える戻り値だけでなく、振る舞いを見る
addは足し算だけを行う例。log(); 5は「ログを出して5を返す」処理の模式的な表記です。戻り値が同じだけでは参照透過性を判断できません。
ひよこ ひよこ
同じ入力なら、同じ答えってこと?
ペンギン先生 ペンギン先生
純粋な計算ではそうだよ。定義の中心は「式をその結果の値に置き換えても、プログラムの意味が変わらない」こと。たとえばadd(a,b)が外部を変更せず足し算だけをするなら、add(2,3) + 1を5 + 1に置き換えても結果は6のままなんだ。
ひよこ ひよこ
いつも5を返せば、参照透過?
ペンギン先生 ペンギン先生
戻り値だけでは足りないよ。毎回ログを書いてから5を返す式を、値の5に置き換えるとログが消えるよね。プログラムの振る舞いが変わるので、そうした入出力や外部の変更も確認するんだ。
ひよこ ひよこ
今の時刻を返す関数は?
ペンギン先生 ペンギン先生
外部の時計を読む式は、呼ぶタイミングで結果が変わるよ。時刻を引数として受け取り、そこから表示用の文字列を計算する部分なら、外部の時計を読む部分と分けて考えられる。入力が何かを明確にすることが大切なんだ。
ひよこ ひよこ
どんなときに役立つの?
ペンギン先生 ペンギン先生
外部状態や呼び出し順に左右されにくいので、計算の結果を推論したりテストしたりしやすいよ。条件を満たす計算では、結果の再利用や並列化を考える助けにもなる。ただしアプリ全体の共有データや入出力まで、自動的に安全になるわけではないんだ。
ひよこ ひよこ
ファイル保存も必要だよね?
ペンギン先生 ペンギン先生
もちろん。純粋な計算と外部とのやり取りを分けて設計できるよ。HaskellではIOという型のアクションとして入出力を扱う。IOの値を組み立てることと、それを実行して外部へ作用することを区別するんだ。モナドはIOだけに使う仕組みではないよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「参照透過性」って出てきたら「計算式をその答えに置き換えても、意味が変わらない性質」と思えばだいたいOK!
📖 おまけ:英語の意味
「Referential Transparency」 = 参照透過性
💬 ここでは、式を結果の値として扱ってもプログラムの意味が変わらないことに注目しよう。

参考資料

← 用語集にもどる