【问题标题】:Scala: currying vs closureScala:柯里化与闭包
【发布时间】:2021-03-11 11:43:12
【问题描述】:

我可以使用闭包来定义这样的函数:

def product(x: Int) = (y: Int) => x * y
val productBy3 = product(3)
println(productBy3(6)) // 18

或者,使用柯里化:

def curriedProduct(x: Int)(y: Int) = x * y
val productBy3 = curriedProduct(3)_
println(productBy3(6)) // 18

一种方法比其他方法有什么优势/劣势?

【问题讨论】:

    标签: scala closures currying


    【解决方案1】:

    第一个是返回函数的方法示例。第二个是具有多个参数列表的方法的示例。

    你使用它们的方式,没有区别。

    当调用 product(3)(6) 时,第二个可能会快一点,但不会达到通常会引起关注的程度。

    如果预期的调用方式是product(3),我会使用第一种形式,如果正常的调用方式是product(3)(6),我会使用第二种形式。

    最后,我想提出一种可能性

    def product(i: Int, j: Int) = i * j
    val productBy3 = product(3, _)
    println(productBy3(6)) //18
    

    在这种情况下,我真的没有看到使用第二种形式而不是这种替代方案或第一种替代方案有任何好处。使用多个参数列表可能有助于在 scala 2 中进行类型推断(请参阅 https://docs.scala-lang.org/tour/multiple-parameter-lists.html),但无论如何这里的推断都没有问题。

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 2018-01-24
      • 2021-02-07
      • 1970-01-01
      • 2017-06-30
      • 2012-12-27
      • 2011-11-03
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多