我没有非常清楚Scala中的部分应用程序函数... 我会做一个例子:
def myOperation(x: Int)(y: Int): Int = {
val complexVal = complexCalc(x)
println("complexVal calculated")
complexVal + y
}
def complexCalc(x: Int): Int = x * 2
val partial = myOperation(5)_
println("calculate")
println("result(3): " + partial(3))
println("result(1): " + partial(1))
输出结果如下:
calculate
complexVal calculated
result(3): 13
complexVal calculated
result(1): 11
所以complexVal
计算了2次,如果我只想计算一次呢?
对于谁具有javascript知识,例如:
function myOperation(x) {
var complexVal = complexCalc(x)
return function(y){
complexVal + y
}
}
修改:
那么我之前写的和之间的区别是什么:
def myOperation2(x: Int, y: Int): Int = {
val complexVal = complexCalculation(x)
println("complexVal calculated")
complexVal + y
}
val partial = myOperation(5)_
val partial2 = myOperation2(5, _: Int)
答案 0 :(得分:4)
您可以从myOperation
明确返回一个函数:
def myOperation(x: Int): Int => Int = {
val complexVal = complexCalc(x)
println("complexVal calculated")
(y: Int) => complexVal + y
}
答案 1 :(得分:3)
部分应用程序只是通过填充现有函数的一些参数来创建一个新函数,但实际上并不执行该函数的任何部分。
对于您尝试做的事情,您希望从函数返回一个函数。在这种情况下,你实际上正在做的是currying(真正的currying)。
试试这个:
def myOperation(x : Int) : (Int => Int => Int) = {
val complexVal = complexCalc(x)
(y : Int) => complexVal + y
}
答案 2 :(得分:2)
部分应用程序将值绑定到函数参数,以便为您提供具有减少的arity(即更少的参数)的函数。这并不能为您昂贵的计算提供任何形式的记忆。
李的回答是解决这个问题的完美方式。