5

我对函数在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)
4

3 回答 3

4

您可以从以下位置显式返回一个函数myOperation

def myOperation(x: Int): Int => Int = {
    val complexVal = complexCalc(x)
    println("complexVal calculated")
    (y: Int) => complexVal + y
}
于 2014-05-26T15:03:38.710 回答
3

部分应用程序只是通过填充现有函数的一些参数来创建一个新函数,但实际上并不执行该函数的任何部分。

对于你想要做的事情,你想从一个函数中返回一个函数。在这种情况下,你实际上在做的是柯里化(真正的柯里化)。

尝试这个:

def myOperation(x : Int) : (Int => Int => Int) = {
   val complexVal = complexCalc(x)
   (y : Int) => complexVal + y
}
于 2014-05-26T15:13:19.297 回答
2

部分应用程序将一个值绑定到一个函数参数,从而为您提供一个减少了数量(即更少的参数)的函数。这不会为您的昂贵计算提供任何形式的记忆。

李的回答是解决这个问题的完美方法。

于 2014-05-26T15:06:43.640 回答