3

我正在尝试学习 Figaro,因为它是在 Scala 中实现的,所以我遇到了一些 Scala 特定的问题。例如在下面的代码中Importance.probability有两个参数,第一个是分布,第二个是谓词。但是当我尝试运行此代码时,出现以下错误:

缺少大于 50 的参数

这是有道理的,因为它实际上需要一个参数。

由于 Scala 是一种函数式语言,我想有一些智能的标准方法可以将函数作为我错过的参数发送?我曾尝试使用_使其部分应用,但这不起作用。

import com.cra.figaro.library.atomic.continuous.Uniform
import com.cra.figaro.algorithm.sampling.Importance

def greaterThan50(d: Double) = d > 50 
val temperatur = Uniform(10,70) 
Importance.probability(temperatur, greaterThan50)
4

2 回答 2

5

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

于 2014-10-20T17:27:42.970 回答
0

这不起作用的原因是因为您调用的方法probability与您认为正在调用的方法不同。

您正在调用probability具有此签名的伴随对象的方法:

def probability[T](target: Element[T], value: T, numSamples: Int = 10000): Double

你可能想要这样的东西:

import com.cra.figaro.library.atomic.continuous.Uniform
import com.cra.figaro.algorithm.sampling.Importance

def greaterThan50(d: Double) = d > 50 
val temperatur = Uniform(10,70)
val alg = Importance(myNumSamples = 100, temperatur)
alg.start()
alg.probability(temperatur, greaterThan50 _)

考虑查看使用Importance.

于 2014-10-20T17:42:49.153 回答