Scala Stream混乱

Eta*_*tam 5 recursion scala tail stream

运行:

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

我期待:

> List(2, 3)
> List(2, 3, 4)
List(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

我得到:

> 3
List(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

你能解释一下吗?

sep*_*p2k 6

你得到一个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)评估返回的流(不包含任何打印语句).