首页 文章

返回Scala for / yield的类型

提问于
浏览
11

我正在阅读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 回答

  • 5

    在这个 for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar 理解中,第一个生成器的类型为 scala.collection.immutable.Range.Inclusive ,屈服结果向量的类型为 scala.collection.immutable.IndexedSeq[Int] ,如果你检查类 Rangehttp://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Range

    它显示 Range extends / mixin IndexedSeq . 超类型 IndexedSeq 与子类型 Range 兼容 .

    如果结果不能用范围表示(如前面的答案所解释的那样),它将“搜索”超类型来表示结果 .

    enter image description here

  • 0

    对于一系列的 mapflatMapfilter 操作,完全理解了这些理解 .

    Range 上使用 map 时,会得到 Vector 输出:

    scala> 0 to 2 map (x => x * x)
    res12: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 4)
    

    这是因为 Range 是一种非常简单的集合,基本上只有两个三个数字:起始值,结束值和步骤 . 如果查看上面映射的结果,可以看到结果值不能用 Range 类型表示 .

相关问题