Когда именно оценивается заголовок потока?

Обычно, если вы создаете объект 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, ?)

( #::является правоассоциативным и является методом добавления в ConsWrapper, который является неявным классом Stream.)

Почему это не оценивает свой заголовок перед добавлением 0? Дело в том, что хвостовой поток (или cons-ячейка) не существует? в куче, пока мы не возьмем значения из результирующего Stream? Но если да, то как мы вызовем метод #::для объекта, который еще не существует?

10
задан Luigi a.k.a. Rhys 25 March 2012 в 01:04
поделиться