0

这是一些对我来说看起来足够合理的代码:

val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)

当我尝试编译它时,我得到两个这样的错误:

Error:(20, 68) type mismatch;
 found   : Int(1)
 required: String
    val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> x + 1, 2 -> x + 2))(4)
                                                                   ^

我了解我的编译器正在尝试使用+. 但它为什么要这样做呢?我如何要求编译器在这里使用整数加法?

(更改IntInteger无济于事。)

4

3 回答 3

5

这是一个重现错误的更简单示例:

scala> def fail(x: Int) = 1 -> x + 1
<console>:10: error: type mismatch;
 found   : Int(1)
 required: String
       def fail(x: Int) = 1 -> x + 1
                                   ^

所有的操作符都是左结合的,所以一切都是从左到右的。也就是说,调用链如下所示:

1.->(x).+(1)

或使用中缀表示法:

(1 -> x) + 1

1 -> x返回一个元组(1, x),而一个元组没有+方法,因此编译器尝试将其隐式转换为Stringvia toString,因为String确实有一个+方法,但最终会失败,因为Int它是必需的。

只需使用括号对事物进行适当的分组:

scala> def foo(x: Int) = 1 -> (x + 1)
foo: (x: Int)(Int, Int)
于 2016-07-21T02:09:28.897 回答
1

'->'与'+'具有相同的优先级1 -> x + 1,因此解析为(1 -> x) + 1. 添加括号作为1 -> (x + 1)修复此错误。

于 2016-07-21T02:10:16.930 回答
0

问题在于,根据Scala 的优先规则->绑定与 . 一样紧密+,因为它以 . 开头-

它通过添加括号来修复:

val myMap: Map[Int, Int] = ((x: Int) => Map[Int, Int](1 -> (x + 1), 2 -> (x + 2)))(4)
于 2016-07-21T02:10:09.153 回答