时要使用部分应用功能
问题描述:
注意:跳转到“问题”的,如果你只是想跳过上下文时要使用部分应用功能
在给予对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发生。通过部分应用的功能,您可以节省相同的打字费用,而且您可以知道您正在使用哪一种功能,因为每次使用时都键入名称!
答
在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
等等。
ahhh我可以看到,真正减少了你需要定义的“重载”函数的数量。谢谢。 – ThaDon
我刚刚读完部分应用函数,并想知道在什么情况下我会使用它,在这里它是.. +1对于优秀的解释 – Sikorski