Normalmente, si se crea un objeto Stream
, la cabeza se ansiosamente evaluó:¿Cuándo se evalúa exactamente el jefe de un flujo?
scala> Stream({println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Si creamos una corriente a la que anteponer en la misma instrucción, parece un poco sorprendente que la cabeza no se evalúa 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 por la derecha y es el método anteponer el ConsWrapper
, que es una clase implícita de Stream
.)
¿Cómo funciona esto no evalúa su cabeza antes de anteponer el 0? ¿Es que la cola Stream (o cons cell) no existe en el montón hasta que tomemos valores de la secuencia resultante? Pero si es así, ¿cómo llamamos al método #::
en un objeto que aún no existe?
Le sugiero que use 'javap' para entender lo que está pasando. –
Lo descubrí mirando la fuente (asumiendo que mi respuesta es correcta) –