好。。。
f()
将字符串作为参数。建构
_.toString
有类型
A <: Any => String
. 函数
F-()
应为
String
,因此上面的示例不进行类型检查。在这种情况下,scala似乎很友好,给了用户另一个机会。错误消息意味着:“根据我的类型推断算法,这不会编译。把这些类型放进去,如果我不能推断的话,它可能会出现。”
在这种情况下,您必须编写匿名函数longhand,即
a.map(n => f(n.toString))
. 这不是类型推断的限制,而是通配符的限制。基本上,当你写作时
a.map(f(_.toString))
, the
字符串
在它能找到的最近的括号内展开成一个匿名函数,否则这将导致巨大的歧义。想象一下
f(g(_.toString))
. 这是否意味着
f(g(x => x.toString))
或
f(x => g(x.toString))
是吗?对于多个嵌套函数调用,会出现更严重的歧义。因此,scala类型检查器采用最符合逻辑的解决方案,如上所述。
吹毛求疵:代码的第一行应该是
val a = List(1,2,3,4)
:)