Scala Stream путаница - PullRequest
       23

Scala Stream путаница

5 голосов
/ 16 декабря 2011

Продолжительность:

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 Ответ

6 голосов
/ 16 декабря 2011

Причина, по которой вы получаете 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) (который не содержит операторов print).

...