注意:如果您只想跳过上下文,请跳至下面的“问题”
在就Scala发表演讲时,我几乎将“玩具问题”作为部分应用函数的例子给出了类似的问题。
def multiply(x:Int, y:Int): Int = x * y
val x5 = multiply(5, _:Int)
x5(10) //produces 50
这个例子确实有帮助,但是我很难解释一般情况“这是你知道何时使用部分应用函数的时候”。
问题:任何人都有自己的成功解释部分应用函数的方法,这些函数真正适合Java(或其他OO语言)开发人员的家庭?
答案 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
谓词通常是部分应用的功能。同样适用于map
,fold
等。