【问题标题】:Usefulness (as in practical applications) of Currying v.s. Partial Application in ScalaCurrying vs. 的有用性(在实际应用中) Scala中的部分应用
【发布时间】:2011-11-09 10:05:25
【问题描述】:

我试图了解 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)

那么,如果我可以那么简单地计算部分应用函数,那么柯里化有什么好处呢?

【问题讨论】:

  • 您的示例中没有使用偏函数。您声明的第二个 val 使用柯里化。另一方面,sum 不使用柯里化 - 它只是将其他函数作为参数并返回函数的高阶函数。
  • partial 是部分应用函数,而不是部分函数。两者是不同的概念。
  • 更新了问题以更好地反映这些 cmets。

标签: scala partial currying


【解决方案1】:

如果第二个参数部分是函数或按名称参数,则通常使用柯里化。这有两个优点。首先,函数参数看起来像一个用大括号括起来的代码块。例如

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

这比非咖喱替代品读起来更好:

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 定义为非柯里化函数,这将不起作用,我必须这样调用它:

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

如果最后一个参数不是函数或名称参数,我不建议使用柯里化。 Scala 的 _ 表示法几乎是轻量级、更灵活且 IMO 更清晰。

【讨论】:

  • 还有一个参数列表被声明为implicit的情况。如果还有其他非隐式参数,则需要进行柯里化。
  • @Jean-PhilippePellet 你能详细说明一下吗?
  • @Hugo def foo[R,S,T](nonImplicitParam: R)(implicit implicitParam: S): T = { ... }
  • "如果最后一个参数不是函数或按名称参数" 还有什么可能?
【解决方案2】:

我认为如果你颠倒你的咖喱例子会变得更清楚:

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

val d = sum4(2, 2) { x =>
  x * x
}

它更像是一种视觉效果,但您不需要在整个表达式周围使用任何括号。当然,您可以使用部分应用程序或通过创建辅助方法来反转参数来获得相同的结果,当然。关键是,如果您一开始就使用 curried 方法,则不必执行所有这些操作。从这个意义上说,currying 更像是一种 API 和语法糖。预计您不会使用

val partial_sum4 = sum4(2, 2)

在您的代码中的任何地方,或者这在任何方面都特别有意义。只是你很容易得到一个好看的表情。

(嗯,在类型推断方面有一些优势……)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多