Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala意外无法确定扩展函数的类型_Scala - Fatal编程技术网

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

为什么,在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
,因此上面的示例不进行类型检查。在这种情况下,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)