3

「関数型プログラミング 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 pPS: おそらく主な問題は、意味がわからないことです。既存の完全なコードを意味するのでしょうか? または、追加される可能性のあるコードはありますか?

4

2 に答える 2

1

式「e」は参照透過的であると理解していますが、可能なすべてのプログラム「p」に対して参照透過的ですか。

具体的なプログラム「p」に対しては「参照透過的」にできますが、「置換規則」に違反する別のプログラム「px」を記述できる場合は、式が参照透過的ではないことを意味します。

  import scala.collection.mutable

  val b = new mutable.StringBuilder("Hello")
  def e = b.length

  def p0 = {
    val l1 = e
    val l2 = e
    l1 + l2
  }

  def p1 = {
    val l1 = e
    b.append("World")
    val l2 = e
    l1 + l2
  }

「p の e は、e を評価した結果で置き換えることができる」に違反するプログラム 'p' をビルドすることは可能です。これは、'e' が参照透過的でないことを意味します。変更可能な状態を使用すると、このプログラムを作成するのは非常に簡単です。

p0 では、e は参照透過的であると言えますが、p1 では簡単にそれが破られます。

于 2014-11-20T06:28:14.797 に答える