参照透過性

参照透過性とはどういう性質か

https://qiita.com/Yametaro/items/1de3c2b76b8a4dc2d30d
https://qiita.com/sasanquaneuf/items/3df1001a027e868e9e0e
式や関数が持ちえる性質で、コードの一部を同等の値に置き換えた場合、プログラム全体の挙動が変わるか、変わらないか、についての性質。
例えば以下のコードの場合「x * 2」という式には参照透過性が無い。
なぜならばxは変数であり、式が評価される時点でどんな値を参照しているか保証できないからである。

var x = 5;
// なにかのコード
console.log(x * 2);

以下のコードの「x * 2」には参照透過性がある。
なぜならばxは定数であり、式が評価される時点でどんな値を参照しているか保証できるからである。
xは透過的に5という値を参照しており、コンパイラがxを5に置き換えてもプログラムの挙動は変わらない。

const x = 5;
// なにかのコード
console.log(x * 2);

メリット

参照透過性が成り立つ言語は、式の値がプログラムのテキストから定まるため、変数の値が実行時点で何であるかということを考えなくてよいというメリットがある。
複数スレッドを動かすプログラムやネットワーク分散処理をするプログラムでは、このメリットは特に大きくなる。
……が、参照透過性を得るために再起やモナドなど複雑な書き方が必要になるため、結局わかりづらいという気がする。

ループの例

参照透過性が無い例。

for (var x=0; x<5; x++) {
  console.log(x * 2);
}

参照透過性がある例……?
確かに再代入はしてないけど、コンパイラがxを特定の値に置き換えてプログラムの動作が変わらないということは、これでは実現できない気がする。コンパイラ再帰処理を実際に実行してみて……みたいなことは出来ないし。

function f(const x, const limit) { // 実際にはこんな構文は無いけど、イメージはこんな感じ
  if (!(x < limit)) return;
  console.log(x * 2);
  f(x + 1, limit);
}
f(0, 5);