为什么,在Scala中,给出了:
a = List(1, 2, 3, 4)
def f(x : String) = { x }
确实
a.map(_.toString)
工作,但
a.map(f(_.toString))
给出错误
missing parameter type for expanded function ((x$1) => x$1.toString)
答案 0 :(得分: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)
:)。