使用for with选项仅适用于某些情况

Arc*_*heg 1 scala

如果我写这个:

val (x, y) = (Some(8), None)
def f(x: Int, y: Int) = x + y

for {x0 <- x; y0 <- y} yield f(x0, y0)
Run Code Online (Sandbox Code Playgroud)

我收到了预期的结果: res5: Option[Int] = None

但如果我试着写:

for {x0 <- x; y0 <- y} yield (x0 + y0)
Run Code Online (Sandbox Code Playgroud)

我收到下一个错误:

<console>:10: error: ambiguous reference to overloaded definition,
both method + in class Int of type (x: Char)Int
and  method + in class Int of type (x: Byte)Int
match argument types (Nothing)
          for {x0 <- x; y0 <- y} yield (x0 + y0)
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释我为什么我的最后一次尝试不起作用?我可能在如何使用和选项工作的内部缺少一些东西.x0应该是Int,不应该吗?

Mic*_*jac 5

将其粘贴到REPL中将清楚地表明y不是Option[Int]:

scala> val (x, y) = (Some(8), None)
x: Some[Int] = Some(8)
y: None.type = None
Run Code Online (Sandbox Code Playgroud)

编译器不能以任何方式推断NoneOption[T]没有明确地被告知,因此它被推断为None.type.您应该使用显式类型注释:

scala> val (x, y) = (Some(8), Option.empty[Int])
x: Some[Int] = Some(8)
y: Option[Int] = None
Run Code Online (Sandbox Code Playgroud)

val (x, y): (Option[Int], Option[Int]) = (Some(8), None) 也会工作.