Scala意外地无法确定扩展功能的类型

ICR*_*ICR 28 scala

为什么,在Scala中,给出:

a = List(1, 2, 3, 4)
def f(x : String) = { x }
Run Code Online (Sandbox Code Playgroud)

a.map(_.toString)
Run Code Online (Sandbox Code Playgroud)

工作,但是

a.map(f(_.toString))
Run Code Online (Sandbox Code Playgroud)

给出错误

missing parameter type for expanded function ((x$1) => x$1.toString)
Run Code Online (Sandbox Code Playgroud)

Fla*_*gan 49

嗯... f()将String作为参数.该构造_.toString具有类型A <: Any => String.函数f()需要一种类型String,因此上面的示例不会键入check.在这种情况下,Scala似乎很友好,并为用户提供了另一次机会.错误消息意味着:"通过我的类型推理算法,这不会编译.将类型放入其中可能,如果它是我无法推断的东西."

在这种情况下,您必须手写编写匿名函数,即a.map(n => f(n.toString)).这不是类型推断的限制,而是通配符的限制.基本上,当你编写时a.map(f(_.toString)),它_.toString会扩展到它可以找到的最近括号内的匿名函数,否则会导致巨大的歧义.想象一下f(g(_.toString)).这是否意味着f(g(x => x.toString))还是f(x => g(x.toString))?多个嵌套函数调用会出现更严重的歧义.因此,Scala类型检查器采用最合理的解决方案,如上所述.

Nitpick:代码的第一行应该是val a = List(1,2,3,4):).