Quando exatamente o chefe de um stream é avaliado?

Normalmente, se você criar umStream objeto, a cabeça será avidamente avaliada:

scala> Stream( {println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)

Se criarmos um Stream ao qual anexamos na mesma declaração, parece um pouco surpreendente que a cabeça não seja avaliada antes da concatenação. i.e.

scala> 0 #:: Stream( {println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)

(#:: é associativo à direita e é o método prefpend emConsWrapper, que é uma classe implícita deStream.)

Como isso não avalia sua cabeça antes de adicionar o 0? Será que o fluxo de cauda (ou célula de contras) não existe no heap até obtermos valores do fluxo resultante? Mas se sim, como chamamos#:: método em um objeto que ainda não exist

questionAnswers(4)

yourAnswerToTheQuestion