Scala:从 f(x1, ... xn) 创建 x1 => f(x2, ..., xn)

Ama*_*asu 0 functional-programming scala

如果我们将其限制为三个参数的情况,我想从中得到

val f = (x: Int, y: Int, z: Int) => x + y + z
Run Code Online (Sandbox Code Playgroud)

对此:

val g = (x: Int) => { (y: Int, z: Int) => f(x, y, z) }
Run Code Online (Sandbox Code Playgroud)

我什至不知道该操作是如何调用的,大概是“柯里化第一个参数”?

Scala 是否有用于此操作的实用函数,或者像上面那样写出来是实现它的唯一方法吗?

Mat*_*zok 5

开箱即用,只有.curried一个柯里化所有参数:

val f = (x: Int, y: Int, z: Int) => x + y + z

f.curried // Int => Int => Int => Int
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用_语法使代码稍微短一些:

(x: Int) => f(x, _, _) // Int => (Int, Int) => Int
Run Code Online (Sandbox Code Playgroud)

如果确实需要经常使用,可以自己实现一些扩展方法

// Scala 2
implicit class Function3CurryFirstOps[A, B, C, D](private val f: (A, B, C) => D) extends AnyVal {
  def curriedFirst: A => (B => C) => D = (a: A) => f(a, _, _)
}

// Scala 3
extension [A, B, C, D](f: (A, B, C) => D)
  def curriedFirst: A => (B => C) => D = (a: A) => f(a, _, _)
Run Code Online (Sandbox Code Playgroud)