Scala流困惑

扫码查看

运行:

lazy val s: Stream[Int] = 1 #:: 2 #:: {val x = s.tail.map(_+1); println("> " + x.head); x}
s.take(5).toList

我期望:
> List(2, 3)
> List(2, 3, 4)
List(1, 2, 3, 4, 5)

我得到:
> 3
List(1, 2, 3, 4, 5)

你能给我解释一下吗?

最佳答案

之所以得到Int而不是List,是因为s是整数流,因此它包含整数,而不是列表。

之所以得到3,是因为(1,2,3,4,5,...)(即s)的尾部是(2,3,4,5,...),并且如果您映射+1在那之上,您将得到(3,4,5,6,7,...)的头为3。

之所以只打印一个整数,是因为该表达式只计算一次就可以得到尾部的数据流。之后,仅评估s.tail.map(_+1)返回的流(不包含任何打印语句)。

10-01 18:13
查看更多