gpt4 book ai didi

scala - Currying 与 Currying 的有用性(在实际应用中) Scala 中的部分应用

转载 作者:行者123 更新时间:2023-12-03 01:10:14 24 4
gpt4 key购买 nike

我试图了解柯里化(Currying)相对于 Scala 中部分应用程序的优势。请考虑以下代码:

  def sum(f: Int => Int) = (a: Int, b: Int) => f(a) + f(b)

def sum2(f: Int => Int, a: Int, b: Int): Int = f(a) + f(b)

def sum3(f: Int => Int)(a: Int, b: Int): Int = f(a) + f(b)

val ho = sum({identity})
val partial = sum2({ identity }, _, _)
val currying = sum3({ identity })

val a = currying(2, 2)
val b = partial(2, 2)
val c = ho(2, 2)

那么,如果我可以这么简单地计算部分应用函数,那么柯里化(Currying)的优点是什么?

最佳答案

柯里化(Currying)主要用于第二个参数部分是函数或按名称参数的情况。这有两个优点。首先,函数参数看起来就像是用大括号括起来的代码块。例如

using(new File(name)) { f =>
...
}

这比未柯里化(Currying)的替代方案读起来更好:

using(new File(name), f => {
...
})

其次,更重要的是,类型推断通常可以找出函数的参数类型,因此不必在调用站点给出。例如,如果我在列表上定义一个 max 函数,如下所示:

def max[T](xs: List[T])(compare: (T, T) => Boolean)

我可以这样调用它:

max(List(1, -3, 43, 0)) ((x, y) => x < y)

或更短:

max(List(1, -3, 43, 0)) (_ < _)

如果我将 max 定义为非柯里化(Currying)函数,这将不起作用,我必须这样调用它:

max(List(1, -3, 43, 0), (x: Int, y: Int) => x < y)

如果最后一个参数不是函数或按名称参数,我不建议柯里化(Currying)。 Scala 的 _ 表示法最轻量,更灵活,而且在我看来更清晰。

关于scala - Currying 与 Currying 的有用性(在实际应用中) Scala 中的部分应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8063325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com