【发布时间】:2014-11-20 05:59:19
【问题描述】:
从《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 的值更改为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是什么意思,是指现有的完整代码吗?或者任何可能添加的代码?
【问题讨论】:
标签: scala functional-programming referential-transparency