gpt4 book ai didi

arrays - 为了理解 Option 数组

转载 作者:行者123 更新时间:2023-12-01 11:28:20 24 4
gpt4 key购买 nike

我遇到编译错误:

Error:(64, 9) type mismatch;
found : Array[(String, String)]
required: Option[?]
y <- x
^

在片段中:

val z = Some(Array("a"->"b", "c" -> "d"))
val l = for(
x <- z;
y <- x
) yield y

为什么 Array 上的生成器不生成数组的项目?拥有 Option 的要求来自哪里?

更荒谬的是,如果我用 println(y) 替换“yield”,那么它确实可以编译。

Scala 版本:2.10.6

最佳答案

这是因为 for 表达式被翻译成 mapflatmapforeach 表达式的方式。让我们首先简化您的示例:

val someArray: Some[Array[Int]] = Some(Array(1, 2, 3))
val l = for {
array: Array[Int] <- someArray
number: Int <- array
} yield number

按照Scala language specification的相关部分, 这首先被翻译成

someArray.flatMap {case array => for (number <- array) yield number}

这又被翻译成

someArray.flatMap {case array => array.map{case number => number}}

问题是 someArray.flatMap 需要一个从 Array[Int]Option[Array[Int]] 的函数,而我们提供了一个来自 Array[Int]Array[Int]

如果 yield number 被替换为 println(number) 编译错误消失的原因是 for 循环与 for comprehensions 的翻译不同:它现在将被翻译如 someArray.foreach{case array => array.foreach {case item => println(item)}},它没有相同的输入问题。

一个可能的解决方案是首先将 Option 转换为您希望最终得到的集合类型,以便其 flatMap 方法具有正确的签名:

val l = for {
array: Array[Int] <- someArray.toArray
number: Int <- array
} yield number

关于arrays - 为了理解 Option 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35304550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com