2011-12-15 100 views
5

運行:斯卡拉流混亂

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) 

你能不能解釋一下?

+2

你爲什麼期望`x.head`返回一個列表? – sepp2k 2011-12-15 21:38:48

+0

讓我困惑的是,爲什麼地球上你會想要在一個懶惰的val的定義裏面放一個'println`。 – 2011-12-16 00:28:49

回答

5

您得到Int而不是List的原因是s是整數流,因此它包含整數而不是列表。

你得到3的原因是(1,2,3,4,5,...)(即s)的尾部是(2,3,4,5,...),如果你將得到(3,4,5,6,7,...),並且它的頭部是3.

打印只有一個整數的原因是表達式是隻評估一次以獲取尾部的流。之後,只評估由s.tail.map(_+1)返回的流(不包含任何打印語句)。