请注意,在 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.02.11.2