scala scala-2.8 scala-collections

scala - Tipo de colección generado por for con rendimiento.



scala-2.8 scala-collections (2)

Cuando evalúo un for en Scala, obtengo un IndexedSeq inmutable (una colección con características de rendimiento similares a una matriz, como un acceso aleatorio eficiente):

scala> val s = for (i <- 0 to 9) yield math.random + i s: scala.collection.immutable.IndexedSeq[Double] = Vector(0.6127056766832756, 1.7137598183155291, ...

¿Un for con un yield siempre devuelve un IndexedSeq , o también puede devolver algún otro tipo de clase de colección (un LinearSeq , por ejemplo)? Si también puede devolver algo más, ¿qué determina el tipo de retorno y cómo puedo influenciarlo?

Estoy usando Scala 2.8.0.RC3.


Gracias michael.kebe por tu comentario.

This explica cómo for se traduce a las operaciones con map , flatMap , filter y foreach . Así que mi ejemplo:

val s = for (i <- 0 to 9) yield math.random + i

se traduce a algo como esto (no estoy seguro de si se ha traducido a map o map flatMap en este caso):

val s = (0 to 9) map { math.random + _ }

El tipo de resultado de las operaciones, como el map en las colecciones, depende de la colección a la que lo llame. El tipo de 0 to 9 es un Range.Inclusive :

scala> val d = 0 to 9 d: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

El resultado de la operación de map en eso es un IndexedSeq (debido a las cosas del constructor dentro de la biblioteca de colecciones).

Entonces, para responder a mi pregunta: el resultado de un for (...) yield ... depende de qué tipo está dentro de las paréntesis. Si quiero una List como resultado, podría hacer esto:

scala> val s = for (i <- List.range(0, 9)) yield math.random + i s: List[Double] = List(0.05778968639862214, 1.6758775042995566, ...


Siempre puede transformar un rango en una lista usando toList:

> val s = for (i <- (0 to 9).toList) yield math.random + i > s : List[Double]