Обычно, если вы создаете объект Stream
, голова будет жадно оценена:
scala> Stream( {println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Если мы создадим Stream, к которому добавляем одно и то же утверждение, кажется немного удивительным, что заголовок не оценивается до объединения. т.е.
scala> 0 #:: Stream( {println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)
(#::
является ассоциативным справа и является методом prepend для ConsWrapper
, который является неявным классом Stream
.)
Как это не оценивает свою голову перед добавлением 0? Неужели хвостовой поток (или ячейка минусов) не существует в куче, пока мы не примем значения из результирующего потока? Но если так, как мы вызываем метод #::
для объекта, который еще не существует?