代码之家  ›  专栏  ›  技术社区  ›  ICR

scala意外地无法确定扩展函数的类型

  •  28
  • ICR  · 技术社区  · 16 年前

    为什么,在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)
    
    1 回复  |  直到 10 年前
        1
  •  49
  •   Flaviu Cipcigan    10 年前

    好。。。 f() 将字符串作为参数。建构 _.toString 有类型 A <: Any => String . 函数 F-() 应为 String ,因此上面的示例不进行类型检查。在这种情况下,scala似乎很友好,给了用户另一个机会。错误消息意味着:“根据我的类型推断算法,这不会编译。把这些类型放进去,如果我不能推断的话,它可能会出现。”

    在这种情况下,您必须编写匿名函数longhand,即 a.map(n => f(n.toString)) . 这不是类型推断的限制,而是通配符的限制。基本上,当你写作时 a.map(f(_.toString)) , the 字符串 在它能找到的最近的括号内展开成一个匿名函数,否则这将导致巨大的歧义。想象一下 f(g(_.toString)) . 这是否意味着 f(g(x => x.toString)) f(x => g(x.toString)) 是吗?对于多个嵌套函数调用,会出现更严重的歧义。因此,scala类型检查器采用最符合逻辑的解决方案,如上所述。

    吹毛求疵:代码的第一行应该是 val a = List(1,2,3,4) :)

    推荐文章