Scala Stream混乱

时间:2011-12-15 21:14:03

标签: scala recursion stream tail

运行:

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)

你能解释一下吗?

1 个答案:

答案 0 :(得分: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)返回的流(不包含任何打印语句)。