Scala局部应用不清楚

时间:2014-05-26 14:53:27

标签: scala partial-application

我没有非常清楚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)

3 个答案:

答案 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(即更少的参数)的函数。这并不能为您昂贵的计算提供任何形式的记忆。

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