Scala:咖喱与闭合

Scala: currying vs closure

提问人:Mandroid 提问时间:11/29/2020 更新时间:11/29/2020 访问量:87

问:

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

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 闭包 咖喱

评论


答:

3赞 Martijn 11/29/2020 #1

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

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

当称为 时,第二个可能会更快一些,但不会达到通常令人担忧的程度。product(3)(6)

当预期的调用方式是 with 时,我会使用第一种形式,如果正常的调用方式是 ,我会使用第二种形式。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),但无论如何,这里没有问题的推理。