我正在阅读Scala for the Impatient并且我让我挠头 .
以下返回String:
scala> for ( c<-"Hello"; i <- 0 to 1) yield (c+i).toChar
res68: String = HIeflmlmop
但是这会返回一个Vector:
scala> for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
res72: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f, m, m, p)
这两个例子前面的文字是......
“当for循环的主体以yield开始时,循环构造一个值集合,每次迭代一个......这种类型的循环称为for comprehension . 生成的集合与第一个生成器兼容 .
如果生成的集合与第一个生成器兼容,那么为什么第二个示例不返回Range类型,如下所示:
scala> val range = 0 to 1
range: scala.collection.immutable.Range.Inclusive = Range(0, 1)
或者我完全误解了文本的意思,“......生成的集合与第一个生成器兼容 . ”
2 回答
在这个
for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
理解中,第一个生成器的类型为 scala.collection.immutable.Range.Inclusive ,屈服结果向量的类型为 scala.collection.immutable.IndexedSeq[Int] ,如果你检查类 Range :http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Range它显示 Range extends / mixin IndexedSeq . 超类型 IndexedSeq 与子类型 Range 兼容 .
如果结果不能用范围表示(如前面的答案所解释的那样),它将“搜索”超类型来表示结果 .
对于一系列的
map
,flatMap
和filter
操作,完全理解了这些理解 .在
Range
上使用map
时,会得到Vector
输出:这是因为
Range
是一种非常简单的集合,基本上只有两个三个数字:起始值,结束值和步骤 . 如果查看上面映射的结果,可以看到结果值不能用Range
类型表示 .