时要使用部分应用功能

问题描述:

注意:跳转到“问题”的,如果你只是想跳过上下文时要使用部分应用功能

在给予对Scala的会谈中,我非常给“玩具问题”类似下面的部分应用功能的例子。

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

这个例子并帮助,但它的强硬让我解释一下一般的“这是当你意识到时要使用一个部分应用的功能”。

问题:任何人都有自己的方式来成功地解释部分应用函数,这对Java(或其他面向对象语言)的开发人员来说真的很有用吗?

假设您想应用销售税。

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

现在假设你想在纽约进行一大堆采购。

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

你通过不指定参数是(当地)总是相同的从原始方法最大的代码重用,又极大的方便了重复性的任务。

人们经常尝试用implicits解决这个代替:

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

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

+0

ahhh我可以看到,真正减少了你需要定义的“重载”函数的数量。谢谢。 – ThaDon

+0

我刚刚读完部分应用函数,并想知道在什么情况下我会使用它,在这里它是.. +1对于优秀的解释 – Sikorski

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

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")) 

我猜Scala有函数组成,这是部分应用函数发光的东西。

另一点是高阶函数等filter称取的谓词,和它们的用法等在:

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

谓词是经常一些部分应用功能。 map,fold等等。