2011-12-15 7 views
5

de reproducción:Scala corriente confusión

lazy val s: Stream[Int] = 1 #:: 2 #:: {val x = s.tail.map(_+1); println("> " + x.head); x} 
s.take(5).toList 

yo esperaría:

> List(2, 3) 
> List(2, 3, 4) 
List(1, 2, 3, 4, 5) 

y me sale:

> 3 
List(1, 2, 3, 4, 5) 

Podría explicar a mí?

+2

¿Por qué esperar 'x.head' para devolver una lista? – sepp2k

+0

Lo que me confunde es por qué querría poner un 'println' dentro de la definición de un val perezoso. –

+2

@Dan: Para saber cuándo y con qué frecuencia se ejecutará la expresión (y cuáles serán los diversos valores cuando lo haga), me imagino. – sepp2k

Respuesta

5

La razón por la que obtiene un Int en lugar de un List es que s es una secuencia de enteros, por lo que contiene enteros, no listas.

La razón por la que obtienes 3 es que la cola de (1,2,3,4,5, ...) (es decir, s) es (2,3,4,5, ...) y si asignar más de 1 que, obtendrá (3,4,5,6,7, ...) y la cabeza de eso es 3.

la razón por la cual sólo se imprime un entero es que la expresión es solo se evaluó una vez para obtener la secuencia de la cola. Después de eso, solo se evalúa la secuencia devuelta por s.tail.map(_+1) (que no contiene ninguna instrucción de impresión).

+0

considere esto: 'val s: Stream [Int] = 1 # :: 2 # :: {val x = s.tail.map (1+); x tomar 10 impresiones; x} 'imprimirá' 3333 ... 'y se cae, entonces' x' parece ser una secuencia de tres, no de 3,4,5, ... pero no tiene sentido porque entonces 's' debería ser un' Stream (1,2,3,3,3, ...) '. Estoy tan confundido, algún consejo, ¿dónde puedo leer más sobre las transmisiones? – 4e6

+0

@ 4e6: El consumo de más elementos de una secuencia que se haya generado aún dentro de la expresión que genera la secuencia, provocará una recursión infinita (que eventualmente explotará la pila). La razón por la que obtienes tantos 3s no es porque la secuencia contenga tantos 3s (si lo hiciera, estarían separados por comas), sino que la instrucción de impresión se ejecuta tantas veces (porque la lógica recurre en círculos y llega a la declaración de impresión una y otra y otra vez ...). – sepp2k

+0

@ 4e6 Considere lo que escribió: para calcular el tercer número, necesita imprimir los 10 primeros números. Pero, ¿cómo puede imprimir el tercer número si aún no lo ha calculado? Ese eres tú obtienes un error. –