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

时间:2009-10-09 17:49:26

标签: scala

为什么,在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)

1 个答案:

答案 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):)。