【问题标题】:Scala partial application unclearScala部分应用不清楚
【发布时间】:2014-05-26 14:53:26
【问题描述】:

我对 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)

【问题讨论】:

    标签: scala partial-application


    【解决方案1】:

    你可以从myOperation显式返回一个函数:

    def myOperation(x: Int): Int => Int = {
        val complexVal = complexCalc(x)
        println("complexVal calculated")
        (y: Int) => complexVal + y
    }
    

    【讨论】:

    • 那么简写 def myOperation(x: Int)(y: Int): Int 在这种情况下完全没用?
    • 人们经常将多个参数列表函数误认为是柯里化,但事实并非如此。真正的柯里化,也就是这里所做的,实际上是执行一个返回另一个函数的函数。多参数列表函数绝不是实际柯里化函数的“简写”。
    • 我已经用另一件事更新了这个问题,这两种写法是一样的吗?
    • 在字节码级别,具有多个参数列表的函数与具有包含多个参数的单个参数列表的函数相同。只有 Scala 编译器关心它们是否不同。
    【解决方案2】:

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

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

    试试这个:

    def myOperation(x : Int) : (Int => Int => Int) = {
       val complexVal = complexCalc(x)
       (y : Int) => complexVal + y
    }
    

    【讨论】:

      【解决方案3】:

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

      Lee 的回答是解决这个问题的绝佳方式。

      【讨论】:

        猜你喜欢
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多