25
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)
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)
那么... 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)
:)。