1. 什么是柯里化
总结
- 柯里化 是将多参数函数转化为一系列单参数函数的技术。
- 它有助于参数复用、函数组合、延迟执行等场景。
- 在函数式编程中,柯里化是构建可维护、可组合代码结构的重要工具。
- 推荐使用通用
curry函数来自动处理柯里化过程,提高开发效率。
✅ 建议:在构建可复用的工具函数或进行函数组合时,优先考虑使用柯里化来提升代码的灵活性和可读性。
概述
柯里化(Currying) 是函数式编程中的一个重要概念,指的是将一个接受多个参数的函数转换为一系列接受单个参数的函数的过程。
柯里化的核心思想是:一次传一个参数,返回一个新函数来处理剩下的参数,直到所有参数都被处理完毕并返回最终结果。
基本示例
未柯里化的函数
function add(a, b, c) {return a + b + c;
}add(1, 2, 3); // 6
柯里化后的函数
function curriedAdd(a) {return function (b) {return function (c) {return a + b + c;};};
}curriedAdd(1)(2)(3); // 6
实现一个通用的柯里化函数
function curry(fn) {return function curried(...args) {if (args.length >= fn.length) {return fn.apply(this, args);} else {return function (...moreArgs) {return curried.apply(this, args.concat(moreArgs));};}};
}
使用示例
function sum(a, b, c) {return a + b + c;
}const curriedSum = curry(sum);curriedSum(1)(2)(3); // 6
curriedSum(1, 2)(3); // 6
curriedSum(1)(2, 3); // 6
柯里化的优点
-
参数复用:
- 可以提前传入部分参数,生成一个“定制化”的函数,后续只需传入剩余参数即可。
-
函数组合(Function Composition):
- 更容易将多个函数组合成新的函数,提升代码的可读性和可维护性。
-
延迟执行:
- 柯里化函数可以在所有参数准备就绪后再执行,适合异步或事件驱动的场景。
应用场景
1. 参数复用
const formatData = (prefix) => (suffix) => `${prefix}-${suffix}`;const formatID = formatData("ID");
formatID("001"); // "ID-001"
formatID("002"); // "ID-002"
2. 高阶函数组合
const compose =(...fns) =>(x) =>fns.reduceRight((acc, fn) => fn(acc), x);const toUpper = (str) => str.toUpperCase();
const trim = (str) => str.trim();
const addPrefix = (prefix) => (str) => `${prefix}${str}`;const formatText = compose(addPrefix("Result: "), toUpper, trim);formatText(" hello world "); // "Result: HELLO WORLD"
3. React 中的事件处理
const handleChange = (field) => (e) => {setFormData({...formData,[field]: e.target.value,});
};<input onChange={handleChange("username")} />;
柯里化与偏函数(Partial Application)的区别
| 特性 | 柯里化(Currying) | 偏函数(Partial Application) |
|---|---|---|
| 参数处理方式 | 每次只接受一个参数 | 可以一次传多个参数 |
| 返回值 | 返回一个新函数,直到参数用尽 | 返回新函数,但不一定处理完所有参数 |
| 是否递归 | 是 | 否 |
