【发布时间】:2017-03-31 20:32:33
【问题描述】:
这可能会变得很愚蠢,但我对 Scala Stream 以不可变方式进行评估有疑问。
假设我有一个这样的流(所有行都在 repl 中执行);
val a = Stream(1,2,3,4,5,6,7,8,9,10);
a: scala.collection.immutable.Stream[Int] = Stream(1, ?)
当我运行以下几行时;
a(3);
a
我明白了;
scala.collection.immutable.Stream[Int] = Stream(1, 2, 3, 4, ?)
我的第一个问题是这个不可变结构是如何改变的?我的意思是如果这样做(假设变量'a'定义为'var'); a = a(3) 我可能会期待这样的结果。
我的另一个问题是当我运行以下几行时;
val a = Stream(1,2,3,4,5,6,7,8,9,10);
a: scala.collection.immutable.Stream[Int] = Stream(1, ?)
val b = a;
b: scala.collection.immutable.Stream[Int] = Stream(1, ?)
b(5);
scala.collection.immutable.Stream[Int] = Stream(1, 2, 3, 4, 5, 6, ?)
a
scala.collection.immutable.Stream[Int] = Stream(1, 2, 3, 4, 5, 6, ?)
正如你在执行 'a' 后的最后一部分中看到的,它似乎又改变了。
如果我尝试使用 List 类型进行这种分配(据我所知 List 是 Stream 的严格版本)并进行一些转换,例如 drop、take 等)
val a = List(1,2,3,4,5)
val b = a;
b.dropRight(1)
变量 'a' 和 'b' 仍然是 List(1,2,3,4,5)
那么这是怎么发生的,我错过了什么?
【问题讨论】:
标签: scala stream immutability memoization