偏函数(Partial Application)和柯里化有什么区别?
请说明偏函数(Partial Application)和柯里化(Currying)的区别与联系。
回答
编译有声
偏函数:固定函数的部分参数,产生一个参数更少的新函数。
function add(a, b, c) { return a + b + c; }
const add5 = add.bind(null, 5); // 固定第一个参数为 5
add5(2, 3); // 10
// 通用偏函数
function partial(fn, ...preset) {
return (...args) => fn(...preset, ...args);
}
区别:
| 特性 | 柯里化 | 偏函数 |
|---|---|---|
| 参数传递 | 每次一个参数 f(a)(b)(c) | 一次固定多个参数 f(a, b)(c) |
| 返回值语义 | 每次返回一个新函数 | 直接返回固定参数后的函数 |
| 执行时机 | 参数收齐后执行 | 同上(固定部分参数) |
| 典型实现 | curry(fn) | bind / partial |
| 数学背景 | 函数变换(多参→单参链) | 参数预填充 |
联系:
- 偏函数可以看作柯里化的一个特例或子集
- 柯里化自动实现了偏函数(参数可分开传递)
- 两者目的都是参数复用和延迟执行
使用场景:
- 柯里化:函数组合(compose)、类型安全
- 偏函数:API 调用封装
const fetchUsers = partial(fetch, '/api/users')