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]