在 Scala 中,部分应用函数(Partially Applied Function) 是指对一个多参数函数只传入部分参数,而留下其余参数待后续传入的函数。它本质上是通过固定函数的部分参数,生成一个新的函数(接收剩余参数),从而实现函数的复用和参数的延迟传递。
基本概念
当一个函数有多个参数时,如果只提供部分参数(而非全部),Scala 会返回一个 “部分应用函数”。这个新函数等待接收剩余的参数,直到所有参数都被提供后才会执行原函数的逻辑。
例如,对于一个接收 3 个参数的函数 f(a, b, c),如果只传入 a 和 b,会得到一个新函数 f_partial(c),它接收剩余的 c 并最终调用 f(a, b, c)。
语法与示例
部分应用函数通过省略部分参数(用下划线 _ 代替未传入的参数)来定义。
1. 基础示例:多参数函数的部分应用
假设有一个计算三个数之和的函数:
def sum(a: Int, b: Int, c: Int): Int = a + b + c
如果只传入前两个参数,剩余的参数用 _ 代替,就会得到一个部分应用函数:
scala
// 固定 a=1, b=2,生成接收 c 的部分应用函数
val partialSum: Int => Int = sum(1, 2, _)
// 后续传入 c=3,执行完整计算
println(partialSum(3)) // 输出:6(1+2+3)
这里 sum(1, 2, _) 表示 “固定 a=1、b=2,等待传入 c”,返回的 partialSum 是一个接收 Int 类型参数(c)并返回 Int 的函数。
2. 省略多个参数
如果省略多个参数,_ 需对应参数的数量和类型:
// 固定 c=3,生成接收 a 和 b 的部分应用函数
val partialSum2: (Int, Int) => Int = sum(_, _, 3)
// 传入 a=1, b=2
println(partialSum2(1, 2)) // 输出:6(1+2+3)
sum(_, _, 3) 表示 “等待传入 a 和 b,固定 c=3”,返回的函数接收两个 Int 参数。
3. 省略所有参数(特殊情况)
如果省略函数的所有参数(即不传入任何参数,仅用 _ 表示),会得到一个接收原函数所有参数的函数值(等价于将原函数转换为函数字面量):
// 省略所有参数,生成与原函数参数列表一致的函数
val sumFunc: (Int, Int, Int) => Int = sum _
// 传入所有参数
println(sumFunc(1, 2, 3)) // 输出:6
这与 “将方法转换为函数字面量” 的用法一致(def 定义的方法需通过 _ 转换为可传递的函数值)。
4. 结合高阶函数使用
部分应用函数常作为参数传递给高阶函数,简化代码:
// 定义一个接收函数参数的高阶函数
def processNumbers(a: Int, b: Int, f: (Int, Int) => Int): Int = f(a, b)
// 定义一个两数相加的函数
def add(x: Int, y: Int): Int = x + y
// 部分应用:固定 add 的第一个参数为 10,生成接收 y 的函数
val add10: Int => Int = add(10, _)
// 将部分应用函数传入高阶函数
println(processNumbers(5, 0, (x, y) => add10(x))) // 输出:15(10 + 5)