Scala部分应用函数

123 阅读1分钟

下面代码展示了 Scala 中的部分应用函数(Partially Applied Function)  特性

/*
*部分应用函数
*如果一个函数需要3个参数,而我们只给了2个参数,会怎么样?
*/


def getSum(a: Int, b: Int, c: Int): Int = {
  a + b + c
}

def main(args: Array[String]): Unit = {
  println(getSum(10, 20, 30))

  val t = getSum(10, 20, _) // t 就是部分应用函数!
  
  val t1 = getSum(_, 20, _) // t1 就是部分应用函数!

  println(t(50))
  println(t1(20, 50))
}

核心逻辑说明

  1. getSum 是一个需要 3 个 Int 参数的函数,返回它们的总和。

  2. main方法中:

    • 直接调用 getSum(10, 20, 30) 会返回 60(10+20+30)。
    • val t = getSum(10, 20, _):只传入前 2 个参数(10 和 20),用_代替第 3 个参数,此时t就成为了一个部分应用函数(只需要 1 个参数即可调用)。
    • val t1 = getSum(_, 20, _):传入中间参数 20,用_代替第 1 和第 3 个参数,此时t1也是部分应用函数(需要 2 个参数才能调用)。

执行结果

  • t(50) 等价于 getSum(10, 20, 50),结果为 80(10+20+50)。
  • t1(20, 50) 等价于 getSum(20, 20, 50),结果为 90(20+20+50)

结论

当函数需要 N 个参数,而我们只传入了 M 个(M < N),并用_代替剩余参数时,会得到一个部分应用函数。这个新函数会 “记住” 已传入的参数,后续只需补充剩余参数即可调用。

这种特性可以简化代码,尤其是在需要重复使用某个函数的固定参数场景时非常方便