Scala意外无法确定扩展函数的类型
为什么,在Scala中,给出:Scala意外无法确定扩展函数的类型,scala,Scala,为什么,在Scala中,给出: a = List(1, 2, 3, 4) def f(x : String) = { x } 做 工作,但是 a.map(f(_.toString)) 给出错误 missing parameter type for expanded function ((x$1) => x$1.toString) 嗯f()将字符串作为参数。构造\uu0.toString的类型为字符串。函数f()需要类型为String,因此上面的示例不进行类型检查。在这种情况下,Sca
a = List(1, 2, 3, 4)
def f(x : String) = { x }
做
工作,但是
a.map(f(_.toString))
给出错误
missing parameter type for expanded function ((x$1) => x$1.toString)
嗯f()
将字符串作为参数。构造\uu0.toString
的类型为字符串
。函数f()
需要类型为String
,因此上面的示例不进行类型检查。在这种情况下,Scala似乎很友好,给了用户另一个机会。错误消息的意思是:“根据我的类型推断算法,这不可编译。如果我无法推断,将类型放入其中,它可能会编译。”
在这种情况下,您必须直接编写匿名函数,即a.map(n=>f(n.toString))
。这不是类型推断的限制,而是通配符的限制。基本上,当您编写a.map(f(u.toString))
时,\uu.toString
会被扩展到它能找到的最接近括号内的匿名函数中,否则这将导致极大的歧义。想象一下类似于f(g(u.toString))
的事情。这是指f(g(x=>x.toString))
还是f(x=>g(x.toString))
?多个嵌套函数调用会产生更严重的歧义。因此,Scala类型检查器采用最符合逻辑的解决方案,如上所述
挑剔:代码的第一行应该是vala=List(1,2,3,4)
:)
missing parameter type for expanded function ((x$1) => x$1.toString)