【问题标题】:Scala overloaded higher-order functions cause type errorScala重载高阶函数导致类型错误
【发布时间】:2013-06-22 09:50:47
【问题描述】:

我有一个重载方法定义如下:

def g(f: () ⇒ Double): Object = null
def g(f: Double ⇒ Double): Object = null
def g(f: (Double, Double) ⇒ Double): Object = null

def h(f: (Double, Double) ⇒ Double): Object = null

虽然h(math.max _) 按预期工作,但调用g(math.max _) 给我错误“重载方法...不能应用于((Int,Int)=> Int)”。看来编译器选择了math.max的Int版本而不是Double版本。

如何以 math.max 作为参数调用我的重载方法g?如果我可以在没有下划线的情况下调用g(math.max),那将是一个额外的好处。

【问题讨论】:

    标签: scala types overloading


    【解决方案1】:

    您遇到了编译器用来帮助避免指数级复杂搜索类型的启发式方法。当方法被重载时,它会尝试根据参数的类型来消除歧义。不幸的是,这个论点被重载了。它没有尝试各种可能性,而是抓住了第一个想到的可能性,但它不起作用。

    您可以通过询问正确的方式来欺骗它进行更多搜索:

    g(math.max(_,_))
    

    从符号上看,现在编译器很清楚它正在寻找 Function2 并且——即使 max 的所有版本都必须是 Function2!——足以让编译器搜索匹配项(它匹配DoubleDouble)。

    【讨论】:

      【解决方案2】:

      发布后几分钟,我发现了这个解决方案:

      g(math.max: ((Double, Double) => Double))
      

      我仍然很好奇为什么 Scala 在第一种情况下会出现问题。

      【讨论】:

      • 正如 Rex 所指出的,max 是一种重载方法,有四种选择。显然只有 max(Double,Double) 有效,但推断者不够聪明,无法看到它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多