部分应用函数

36 阅读3分钟

在 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=1b=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)