「関数型プログラミング in scala」の本から、式の「参照透過」の定義がわかります。
式 e は、すべてのプログラム p について、p 内のすべての e の出現を、p の意味に影響を与えることなく e を評価した結果で置き換えることができる場合、参照透過的です。
参照透過かどうかわからないコード例がいくつかあります。
scala.collection.mutable.StringBuilder
変更可能なクラスである例で使用します
1.
val x = new StringBuilder("Hello")
println(x.length)
println(x.length)
ここのコードは、 を使用する完全なコード全体であるとしますx
。
x
式は参照透過式と言えますか?
x
その値をすべて変更してnew StringBuilder("Hello")
も、プログラムの観察可能な動作は変更されません。
val x = new StringBuilder("Hello")
println(new StringBuilder("Hello").length)
println(new StringBuilder("Hello").length)
2.
val x = new StringBuilder("Hello")
val y = x.append("aaa")
ここのコードが、 と を使用する完全なコードであるとしx
ますy
。
y
プログラムでまったく使用されていないため、参照が透過的であると言えますか?
3.
def getTheClassName(n:Int):String = {
val x = new StringBuilder("hello")
for(int i=0;i<n;i++) {
x.append("world")
}
return x.getClass.getName
}
x
参照透過性があると言えますか? どのように値に置き換えても、戻り値は変更されないためです。
for all programs p
PS: おそらく主な問題は、意味がわからないことです。既存の完全なコードを意味するのでしょうか? または、追加される可能性のあるコードはありますか?