2010-02-17 17 views

Respuesta

41

En una vista, los elementos se vuelven a calcular cada vez que se accede a ellos. En una secuencia, los elementos se conservan a medida que se evalúan.

Por ejemplo:

val doubled = List(1,2,3,4,5,6,7,8,9,10).view.map(_*2) 
println(doubled.mkString(" ")) 
println(doubled.mkString(" ")) 

reevaluará el mapa para cada elemento dos veces. Una vez para la primera impresión, y otra vez para la segunda. Por el contrario

val doubled = List(1,2,3,4,5,6,7,8,9,10).toStream.map(_*2) 
println(doubled.mkString(" ")) 
println(doubled.mkString(" ")) 

solo duplicará los elementos una vez.

Una vista es como una receta para crear una colección. Cuando pides elementos de una vista, lleva a cabo la receta cada vez.

Una transmisión es como un tipo con un montón de tarjetas de borrado en seco. El chico sabe cómo calcular los elementos posteriores de la colección. Puede pedirle el siguiente elemento de la colección y le entrega una tarjeta con el elemento escrito en ella y una cuerda atada desde la tarjeta hasta su dedo (para ayudarlo a recordar). Además, antes de darte una carta, desata la primera cuerda de su dedo y la ata a la nueva.

Si se agarra a la primera tarjeta (es decir, mantiene una referencia a la cabeza de la secuencia) es posible que se quede sin tarjetas (es decir, memoria) cuando solicite el siguiente elemento, pero si no necesita Vuelva a los primeros elementos, puede cortar la cuerda y devolverle las tarjetas innecesarias al tipo y él puede volver a usarlas (después de todo, son de borrado en seco). Así es como una secuencia puede representar una secuencia infinita sin quedarse sin memoria.

+0

@huynhj lo tienes todo bien. Puedo actualizar la respuesta para que quede más claro –

+1

puede dejar la respuesta tal como está. A veces una metáfora ayuda. En este caso, me confundí. La primera oración lo tenía todo. – huynhjl

+1

El ejemplo de cadena es muy confuso. – ziggystar

10

Geoff 's answer cubre casi todo, pero quiero añadir que un Stream es una secuencia List -como, mientras que cada tipo de colecciones (mapas, juegos, SEQs indexados) tienen puntos de vista.

+0

Tengo una duda. ya que la función es pura. ¿Por qué el compilador no utiliza la transparencia referencial o la memorización? ¿Por qué ver es volver a calcularlo de nuevo? –

Cuestiones relacionadas