何时使用部分应用功能

Tha*_*Don 15 functional-programming scala

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

在谈论Scala时,我几乎给出了"玩具问题",如下面的部分应用函数的例子.

def multiply(x:Int, y:Int): Int = x * y
val x5 = multiply(5, _:Int)
x5(10) //produces 50
Run Code Online (Sandbox Code Playgroud)

这个例子确实有帮助,但是我很难解释一般情况"这是当你认识何时使用部分应用函数时".

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

Rex*_*err 25

假设您要申请销售税.

def withTax(cost: Float, state: String) = { /* Some complicated lookup table */ }
Run Code Online (Sandbox Code Playgroud)

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

val locallyTaxed = withTax(_: Float, "NY")
val costOfApples = locallyTaxed(price("apples"))
Run Code Online (Sandbox Code Playgroud)

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

人们经常尝试用隐含来解决这个问题:

def withTax(cost: Float)(implicit val state: String) = ...
Run Code Online (Sandbox Code Playgroud)

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


mic*_*hid 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"))
Run Code Online (Sandbox Code Playgroud)