2009-10-09 90 views

回答

44

那么... f()需要一个字符串作为参数。构建体_.toString的类型为A <: Any => String。功能f()需要一种String,因此上面的示例没有键入检查。看起来Scala在这种情况下很友善,给用户另一个机会。错误信息的意思是:“通过我的类型推理算法,这不会编译,把类型放进去,如果这是我无法推断的东西。”

在这种情况下,您将不得不编写匿名函数longhand,即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) :)。