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.使用部分应用的功能,您可以节省相同的打字成本,而且您知道您正在使用哪一个,因为您每次使用时都会键入名称!
在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)
归档时间: |
|
查看次数: |
2968 次 |
最近记录: |