【问题标题】:How Immutability is Achieved in Scala Streams?Scala Streams 如何实现不变性?
【发布时间】: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


    【解决方案1】:

    Scala Streams 提供 memoization - 它们就像惰性列表,但是一旦生成了元素,它们就会被存储起来以备将来检索。

    因此,当您通过请求索引 5 处的元素“强制”Stream b 评估其某些元素时,也会强制原始 Stream a(它是同一个 Stream 对象)。

    关键点:这样做不会修改流(它仍然是不可变的),它只是改变了哪些元素已被评估并被记忆。

    您的Stream(1,?)Stream(1,2,3,4,5,6,?) 是同一个流,只是评估的程度不同:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多