Scala重载高阶函数导致类型错误

标签 scala types overloading

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

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 版本而不是双版本。

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

最佳答案

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

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

g(math.max(_,_))

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

关于Scala重载高阶函数导致类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17249374/

相关文章:

c++ - 哪个是更专业的模板功能? clang 和 g++ 对此有所不同

list - 针对给定编码问题的优化解决方案

scala - 猫 : Non tail recursive tailRecM method for Monads

c++ - 如何将类型传递给类

c# - 最快的类型比较?

java - Java 中的新功能 Lambda 重载

scala - 如何为隐式方法实现中间类型?

scala - JVM的NUMA意识

javascript - 在 Javascript 中如何检查提供的参数是否是字节数组类型?

.net - 通过 float 或decimal 调用参数为 double 的重载函数