函数柯里化
函数柯里化(Currying) 是一种将多个参数的函数转换为一系列使用一个参数的函数的技术。它通过将一个接收多个参数的函数转化为一系列接收一个参数的函数来逐步处理。
函数柯里化的基本概念:
- 假设有一个函数
f(a, b, c)
,柯里化后的形式是f(a)(b)(c)
,即每个参数逐一传入,而不是一次性传入所有参数。 - 柯里化的核心思想是部分应用,即可以通过分步骤的方式传入函数的参数。
柯里化的实现:
假设我们有一个函数 add(a, b)
,它接受两个参数并返回它们的和:
function add(a, b) {
return a + b;
}
柯里化后的 add
函数变成了:
function curriedAdd(a) {
return function(b) {
return a + b;
};
}
调用方式:
const add5 = curriedAdd(5); // 返回一个新的函数,已知第一个参数是 5
console.log(add5(3)); // 输出 8
例子:柯里化一个三参数函数
我们可以进一步柯里化一个有三个参数的函数:
function multiply(a, b, c) {
return a * b * c;
}
柯里化后:
function curriedMultiply(a) {
return function(b) {
return function(c) {
return a * b * c;
};
};
}
调用方式:
const result = curriedMultiply(2)(3)(4); // 2 * 3 * 4 = 24
console.log(result); // 输出 24
为什么要使用柯里化?
-
部分应用: 柯里化使得我们可以创建一个新函数,将一些参数固定,剩下的参数稍后再提供。这对于重复使用某些参数值的场景非常有用。
-
提高可重用性: 柯里化可以使函数更加灵活和可复用。通过预先提供部分参数,剩下的参数可以通过不同的函数调用来组合。
-
函数式编程: 柯里化是函数式编程中的重要概念,支持构建可组合的函数。它鼓励我们通过组合小的、简洁的函数来构建复杂的逻辑。
例子:部分应用
假设我们要计算两个数相加并乘以某个固定数:
function multiply(a, b) {
return a * b;
}
function add(a, b) {
return a + b;
}
function calculate(a, b, c) {
return multiply(add(a, b), c);
}
现在,如果我们希望固定 c = 2
,并多次计算不同的 a
和 b
,可以使用柯里化来简化操作:
const curriedCalculate = (a) => (b) => (c) => multiply(add(a, b), c);
const calcWithC2 = curriedCalculate(5)(3); // 创建了一个已固定 `a = 5`, `b = 3` 的函数
console.log(calcWithC2(2)); // 计算 (5 + 3) * 2 = 16
总结:
- 函数柯里化 是将一个多参数函数转化为一系列嵌套的单参数函数。
- 通过柯里化,我们可以灵活地创建具有部分应用功能的函数,从而提高代码的复用性和可读性。
- 柯里化常见于函数式编程,并且在处理复杂的参数传递时非常有用。
案例
// 装饰工厂,因为不能直接给dec传参,使用函数柯里化传入参数 const Base = (name:string) => { const dec:ClassDecorator = (target) => { // 给类加装饰,对http添加属性和方法 target.prototype.name = name target.prototype.fn = () => { console.log('fn'); } } return dec } // 使用装饰器的时候传入参数 @Base('bai')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?