2017-03-31 9 views
2

愚かになるかもしれませんが、私はScala Streamの評価に関して不変の方法で質問しています。Scalaストリームで不変性がどのように達成されていますか?

私はこのようなストリームを持っていると言います(すべての行はreplで実行されます)。

val a = Stream(1,2,3,4,5,6,7,8,9,10); 

:scala.collection.immutable.Stream [INT] =ストリーム(1?)

Iは、次の行を実行します。

a(3); 
a 

です。

scala.collection.immutable.Stream [INT] =ストリーム(1、2、3、4、?)

は私の最初の質問は、この不変構造が変化取得する方法は?私はこれが好きならば(変数 'a'は 'var'として定義されていると仮定します) a = a(3)そのような結果が期待されるかもしれません。

私の次の質問は、次の行を実行するときです。

val a = Stream(1,2,3,4,5,6,7,8,9,10); 

:scala.collection.immutable.Stream [INT] =ストリーム(1?)

val b = a; 

B:scala.collection.immutable.Stream [INT] =ストリーム(1?)

b(5); 

scala.collection.immutable.Stream [INT] =ストリーム(1、2、3、4、5、6、?)

a 

scala.collection.immutable.Stream [INT] =ストリーム(1、2、3、4、5、6、?)

あなたが最後の部分で見ることができるように'a'を実行した後、再び変更されたようです。私は(私の知る限りリストはストリームの厳格なバージョンである知っているように)リスト型と代入のこの種を試してみて、ドロップのようないくつかの変換を行う場合

などを取る)

val a = List(1,2,3,4,5) 
val b = a; 
b.dropRight(1) 

変数「」と'b'は依然としてまだリストです(1,2,3,4,5)

これはどうやって起こったのですか、私の欠点は何ですか?

答えて

2

Scala Streams提供memoization - これらはレイジーリストのようですが、要素が生成されると、後で取得するために保存されます。

ときに「力」のインデックス5で要素を要求することにより、その要素のいくつかを評価するためのストリームbをので、(同じStreamオブジェクトである)元のストリームaも強制されます。

要点:これを実行しないとが変更されます(変更不可能なままです)。変更された要素とメモされた要素が変更されます。

scala> val a = Stream(1,2,3,4,5,6,7,8,9,10); 
a: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

scala> val b = a 

scala> a(3) 
res9: Int = 4 

scala> a 
res10: scala.collection.immutable.Stream[Int] = Stream(1, 2, 3, 4, ?) 

scala> b 
res11: scala.collection.immutable.Stream[Int] = Stream(1, 2, 3, 4, ?) 

scala> Stream(1,2,3,4,5,6,7,8,9,10) == a 
res12: Boolean = true 

scala> Stream(1,2,3,4,5,6,7,8,9,10) == b 
res13: Boolean = true 

あなたStream(1,?)Stream(1,2,3,4,5,6,?)はちょうど異なる程度に評価された同じ流れ、あります

関連する問題