从“scala中的函数式编程”一书中,我看到了一个表达式的“引用透明”的定义:
如果对于所有程序 p,表达式 e 是指代透明的,如果 p 中所有出现的 e 都可以替换为 e 的计算结果而不影响 p 的含义。
我有一些代码示例,我不确定它们是否具有引用透明性。
我将scala.collection.mutable.StringBuilder
在示例中使用可变类
1.
val x = new StringBuilder("Hello")
println(x.length)
println(x.length)
假设这里的代码是使用x
.
我可以说表达式x
是引用透明表达式吗?
如果我x
用它的 value改变 all 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
是参考透明的吗?因为无论我如何用它的值替换它,返回值都不会改变。
PS:也许主要问题是我不明白是什么for all programs p
意思,是指现有的完整代码吗?或者任何可能添加的代码?