22

当我for在 Scala 中评估 a 时,我得到一个不可变的IndexedSeq(具有类似数组的性能特征的集合,例如高效的随机访问):

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

for带有 a 的 a是否yield总是返回 an IndexedSeq,或者它也可以返回某种其他类型的集合类(LinearSeq例如 a )?如果它还可以返回其他东西,那么是什么决定了返回类型,我该如何影响它?

我正在使用 Scala 2.8.0.RC3。

4

2 回答 2

19

感谢 michael.kebe 的评论。

解释了如何for转换为带有mapflatMapfilter的操作foreach。所以我的例子:

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

被翻译成这样的东西(我不确定它是否被翻译成mapflatMap在这种情况下):

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

对集合等操作的结果类型map取决于您调用它的集合。的类型0 to 9Range.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)

结果map对其进行操作IndexedSeq是(因为集合库中的构建器内容)。

所以,回答我的问题: a 的结果for (...) yield ...取决于括号内的类型。如果我想要一个List结果,我可以这样做:

scala> val s = for (i <- List.range(0, 9)) yield math.random + i
s: List[Double] = List(0.05778968639862214, 1.6758775042995566, ...
于 2010-06-01T08:17:06.013 回答
6

您始终可以使用 toList 将范围转换为列表:

> val s = for (i <- (0 to 9).toList) yield math.random + i
> s  : List[Double]
于 2013-04-29T22:57:12.873 回答