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