何时使用部分应用功能

时间:2011-08-19 17:54:05

标签: scala functional-programming

注意:如果您只想跳过上下文,请跳至下面的“问题”

在就Scala发表演讲时,我几乎将“玩具问题”作为部分应用函数的例子给出了类似的问题。

def multiply(x:Int, y:Int): Int = x * y
val x5 = multiply(5, _:Int)
x5(10) //produces 50

这个例子确实有帮助,但是我很难解释一般情况“这是你知道何时使用部分应用函数的时候”。

问题:任何人都有自己的成功解释部分应用函数的方法,这些函数真正适合Java(或其他OO语言)开发人员的家庭?

3 个答案:

答案 0 :(得分:25)

假设您要申请销售税。

def withTax(cost: Float, state: String) = { /* Some complicated lookup table */ }

现在假设您想在纽约进行大量购物。

val locallyTaxed = withTax(_: Float, "NY")
val costOfApples = locallyTaxed(price("apples"))

您可以从原始方法获得最大代码重用,但不必指定(本地)始终相同的参数,从而最大限度地方便重复任务。

人们经常尝试用暗示来解决这个问题:

def withTax(cost: Float)(implicit val state: String) = ...

不要这样做! (并非没有仔细考虑。)很难跟踪当时发生的隐式val。使用部分应用的功能,您可以节省相同的打字成本,而且您知道每次使用时都会使用哪一个!

答案 1 :(得分:8)

在Java中,您经常将部分应用函数的第一个(或更多)参数传递给类的构造函数。 Rex的例子可能看起来像这样:

class TaxProvider {
    final String state;

    TaxProvider(String state) {
        this.state = state;
    }

    double getTaxedCost(double cost) {
      return ... // look up tax for state and apply to cost
    }
}


TaxProvider locallyTaxed = new TaxProvider("NY")
double costOfApples = locallyTaxed.getTaxedCost(price("apples"))

答案 2 :(得分:1)

我猜Scala有函数组合,这是部分应用函数闪耀的东西。

另一点是高阶函数,如filter,它采用谓词,其用法如下:

filter (<42) list  -- sorry, don't speak Scala

谓词通常是部分应用的功能。同样适用于mapfold等。