¿Cuándo se evalúa exactamente la cabeza de un Stream?

Normalmente si creas unaStream objeto, la cabeza será evaluada con entusiasmo:

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

Si creamos una secuencia a la que anteponemos la misma declaración, parece un poco sorprendente que la cabeza no se evalúe antes de la concatenación. es decir

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

(#:: es asociativo a la derecha y es el método de anteponer enConsWrapper, que es una clase implícita deStream.)

¿Cómo no evalúa esto su cabeza antes de anteponer el 0? ¿Es que el flujo de cola (o la celda de contras) no existe en el montón hasta que tomamos valores del flujo resultante? Pero si es así, ¿cómo llamamos a la#:: método en un objeto que aún no existe?

Respuestas a la pregunta(4)

Su respuesta a la pregunta