如果我写这个:
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,不应该吗?
将其粘贴到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)
编译器不能以任何方式推断None为Option[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) 也会工作.
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |