柯里化与偏应用
偏应用怎样从复杂函数得到简单函数?
- 偏应用: 预先填入原函数的一部分参数,返回等待其余参数的新函数;
- 适用时机: 已知一部分数据,希望把它固化为可复用行为;
const partial =
(fn, ...args) =>
(...moreArgs) =>
fn(...args, ...moreArgs);
const add3 = (a, b, c) => a + b + c;
const fivePlus = partial(add3, 2, 3);
fivePlus(4); // 9
- JavaScript 也可用
bind:add3.bind(null, 2, 3);
柯里化与偏应用有什么区别?
- 柯里化: 把多参数函数改造成每次只接收一个参数的函数链;
- 偏应用: 给函数预填任意数量的参数,不要求原函数先变成一元链;
- 联系: 柯里化函数每调用一次而参数未齐时,自然形成一次偏应用;
const sum = (a, b) => a + b;
const curriedSum = (a) => (b) => a + b;
curriedSum(40)(2); // 42
const add2 = curriedSum(2);
add2(10); // 12
自动柯里化何时执行原函数?
- 参数不足: 返回继续收集剩余参数的函数;
- 参数达到元数: 调用原函数并返回结果;
- 常见实现: Lodash 与 Ramda 的
curry;
const add = (x, y) => x + y;
const curriedAdd = _.curry(add);
curriedAdd(1, 2); // 3
curriedAdd(1); // (y) => 1 + y
curriedAdd(1)(2); // 3