Jes*_*per 22 scala scala-2.8 scala-collections
当我for在Scala中评估一个时,我得到一个不可变的IndexedSeq(一个具有类似数组的性能特征的集合,例如高效的随机访问):
scala> val s = for (i <- 0 to 9) yield math.random + i
s: scala.collection.immutable.IndexedSeq[Double] = Vector(0.6127056766832756, 1.7137598183155291, ...
Run Code Online (Sandbox Code Playgroud)
是for一个yield总是返回一个IndexedSeq,还是它还可以返回一些其他类型的集合类(LinearSeq例如,a)?如果它还可以返回其他内容,那么什么决定了返回类型,我该如何影响它呢?
我正在使用Scala 2.8.0.RC3.
Jes*_*per 19
感谢michael.kebe的评论.
这解释了如何for转换为操作与map,flatMap,filter和foreach.所以我的例子:
val s = for (i <- 0 to 9) yield math.random + i
Run Code Online (Sandbox Code Playgroud)
被翻译成这样的东西(我不确定它是否被翻译成map或flatMap在这种情况下):
val s = (0 to 9) map { math.random + _ }
Run Code Online (Sandbox Code Playgroud)
结果类型的操作类似于map集合,取决于您调用它的集合.类型0 to 9是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)
Run Code Online (Sandbox Code Playgroud)
操作的结果map是IndexedSeq(因为集合库中的构建器内容).
所以,回答我的问题:a的结果for (...) yield ...取决于parantheses内部的类型.如果我想要一个List结果,我可以这样做:
scala> val s = for (i <- List.range(0, 9)) yield math.random + i
s: List[Double] = List(0.05778968639862214, 1.6758775042995566, ...
Run Code Online (Sandbox Code Playgroud)
您始终可以使用toList将范围转换为列表:
> val s = for (i <- (0 to 9).toList) yield math.random + i
> s : List[Double]
Run Code Online (Sandbox Code Playgroud)