由yield生成的集合类型

时间:2010-06-01 07:18:24

标签: scala scala-2.8 scala-collections

2 个答案:

答案 0 :(得分:19)

感谢michael.kebe的评论。

This解释了for如何转化为mapflatMapfilterforeach的操作。所以我的例子:

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

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

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

集合上的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)

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

所以,回答我的问题: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, ...

答案 1 :(得分:6)

您始终可以使用toList:

将范围转换为列表
> val s = for (i <- (0 to 9).toList) yield math.random + i
> s  : List[Double]