Scala:柯里化与闭包
Scala: currying vs closure
我可以像这样使用闭包来定义函数:
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
任何advantage/disadvantage一种方法优于其他方法?
第一个是返回函数的方法示例。第二个是具有多个参数列表的方法示例。
您使用它们的方式没有区别。
当调用 product(3)(6)
时,第二个可能会快一点,但不会达到通常需要担心的程度。
如果预期的调用方式是 product(3)
,我会使用第一种形式,如果正常的调用方式是 product(3)(6)
.[=15,我会使用第二种形式=]
最后,我想建议
的可能性
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),但无论如何这里的推断都没有问题。
我可以像这样使用闭包来定义函数:
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
任何advantage/disadvantage一种方法优于其他方法?
第一个是返回函数的方法示例。第二个是具有多个参数列表的方法示例。
您使用它们的方式没有区别。
当调用 product(3)(6)
时,第二个可能会快一点,但不会达到通常需要担心的程度。
如果预期的调用方式是 product(3)
,我会使用第一种形式,如果正常的调用方式是 product(3)(6)
.[=15,我会使用第二种形式=]
最后,我想建议
的可能性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),但无论如何这里的推断都没有问题。