【发布时间】:2016-10-04 12:50:28
【问题描述】:
第一个 for 表达式是基本示例。第二个 for-expr 引入了我认为会产生相同输出的轻微变化。但因编译错误而失败。是什么原因以及如何解决?
for {
n <- List(1,2)
c <- "ABC"
} yield s"$c$n"
//res0: List[String] = List(A1, B1, C1, A2, B2, C2)
for {
opt <- List(None, Some(1), None, None, Some(2), None)
n <- opt
c <- "ABC"
} yield s"$c$n"
//Error:(14, 5) type mismatch;
//found : scala.collection.immutable.IndexedSeq[String]
//required: Option[?]
// c <- "ABC"
// ^
【问题讨论】:
-
在这种情况下是的,因为第二个提取器就像
flatMap所以你需要返回一个选项。为清楚起见,由于隐式转换,您可以在第一种情况下提取“ABC”,这样事物就变成了一个列表并编译,在第二种情况下,“ABC”不会隐式转换为选项。