Scala意外地无法确定扩展函数的类型
发布时间:2020-12-16 09:48:44 所属栏目:安全 来源:网络整理
导读:为什么,在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) 解决方法 嗯… f()接受一个String作为参数
为什么,在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) 解决方法
嗯… f()接受一个String作为参数。构造_.toString具有类型A< ;: Any =>串。函数f()期望一种类型的String,因此上面的示例不会输入check。看来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,4):)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |