请注意,在 Scala 中,您可以传递函数 value,就像greaterThan50
期望函数一样。
在这种情况下,在probability
方法中,定义为
def probability[T](target: Element[T], predicate: T => Boolean): Double
greaterThan50
第二个参数是一个函数,但是为什么编译器在传递实际上是一个函数值时不接受呢?
这是因为还有另一个重载方法,Importance
其定义如下:
def probability[T](target: Element[T], value: T): Double
所以当我们打电话
Importance.probability(temperatur, greaterThan50)
编译器实际上选择了秒重载方法。这就是为什么它尽最大努力greaterThan50
在某个值上应用该方法,以便获得一些结果作为返回,该结果可以用作类型为 的第二个参数T
。
在这种情况下,为了消除歧义,您需要部分应用该功能:
Importance.probability(temperatur, greaterThan50 _)
这消除了这种情况的歧义,因为现在的类型greaterThan50 _
与Double => Boolean
第一个重载函数完全匹配。
一个实验来证明
为了确保这种方法适用于非重载方法,您可以简单地尝试在您的上下文中定义以下函数(object
例如):
def probability[T](target: Element[T], predicate: T => Boolean): Double = 10
并调用它
probability(temperatur, greaterThan50) // Note that this function is defined by you
你会看到没有编译错误,因为编译器需要一个函数并且你给它一个函数值。
其他选项
当然,您可以将函数文字传递给probability
:
Importance.probability[Double](temperatur, (x: Double) => x > 50)
或者你可以greaterThan50
这样定义:
def greaterThan50 = (d: Double) => d > 50
这将(Double) => Boolean
是再次完全匹配的类型。
免责声明
使用Scala 版本的figaro
版本。2.4.0.0
2.11.2