関数型プログラミング言語Haskell
■ このスレッドは過去ログ倉庫に格納されています
0483デフォルトの名無しさん
NGNGまあ「副作用の部分を書いてない」といえばその通りだが...
例えば配列aのn番目にvを代入するのに、
set_array :: Array a->Int->a->Array a
という関数があるとして、
let a2 = set_array a n v
in
...
set_arrayが「変更された後のa」をa2として返すものとする。
これは参照の透明性を何ら損なわないよね? ただし、破壊的に
代入はできない。aを(少なくとも変更部分だけ)コピーして
おかなければならない。
ここで、「set_arrayが値を返した後は、古いaが使われることはない
(古いaの値を見ているやつは誰もいない)」と保証できたとする。
すると、わざわざコピーしなくても、上書きしてしまっても、
誰も副作用に気が付かない。つまり、コピーしても
上書きしても意味としては同じことになる。
「Worldへの参照が、必ず1個所しか存在しない」ことを保証する
ように工夫したのがモナド。純粋に関数的に解釈するなら、
「putCharするごとにWorldがコピーされる」と思えば良い。
ただし、実際には副作用を使っても、絶対に誰も違いに気が付かない。
■ このスレッドは過去ログ倉庫に格納されています