参照透明性

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

只今、『ふつうのHaskellプログラミング』を読んでいるのですが、「参照透明性」のメモです。
第5章のP.112-P.113のコラムです

Haskellの評価を置き換えモデルで説明できるのは、Haskellに「ある式は、それと等しい式で置き換えられる」という性質があるからです。
例えば式(f 5)の値が10なら、そのスコープ内の式(f 5)はすべて値10に置き換えられます。この性質を参照透明性であるといいます。また、参照透明性がある言語のことを参照透明であると言います。つまりHaskellは参照透明です。

(中略)

言語に(再)代入があると、ある式を、それと等しい値で置き換えられなくなります。つまり参照透明でなくなります。
参照透明性を失わせる原因は(再)代入だけではありません。入出力など、いわゆる副作用を伴う機能はすべて参照透明性を失わせます。
Haskellに(再)代入がないのも、入出力にIOモナドのような特殊な仕組みを使わなければいけないのも、参照透明性を確保するためなのです。

他の本でも「参照透明性」の解説を読んでみたのですが、この解説が一番分かりやすいと思いました。
また、本書の第5章の遅延評価の「置き換えモデル」と「最内簡約と最外簡約」と「グラフ簡約」に出てくる例の事を読んだ後に、参照透過性を考えると理解しやすいかも。
つまり、「置き換えモデル」と「最内簡約と最外簡約」と「グラフ簡約」は参照透明性を保証するための仕組み(?)ですよね。

「参照透過性」で検索してみました。

http://blog.livedoor.jp/dankogai/archives/50454547.html

世の中のほとんどのものは、参照等価じゃないというのはわかると思う。だから、ほとんどのプログラム言語はそのことを真剣に取り合わず、「関数」といえば「戻り値付きサブルーチン」のことを指していた。だけど、もしプログラムの方が参照等価を勝手に何らかの形で保証してくれたらどうだろう?今まで「計算」だと思っていたものが実は「値の参照」だったとしたら?

なるほど、さすが弾さん。解説の例が分かりやすい。


wikipediaでは、猛烈に難しい事書いてあって分け分からないからパス。
http://ja.wikipedia.org/wiki/%e5%8f%82%e7%85%a7%e9%80%8f%e9%81%8e%e6%80%a7


「参照透明性」で検索してみました。

http://squab.no-ip.com:8080/wiki/614

式と値が一対一に対応していること。
関数にある引数を渡すと必ずついでも同じ結果を返すという性質。
プログラムの実行効率を高め、またプログラムを単純化できバグの混入を減らすことができるが、外部入出力を扱うための複雑な機構が必要になることが多い。--SHIMADA

なるほど。プログラムのバグを減らす事ができるのね。


参照透過性について、なんとなく分かったような気がします。
あとはHaskellでプログラムを書きまくってみます。