柯里化是将多参数函数转换为一系列单参数函数的过程,通过分步接收参数实现延迟执行,最终在参数齐备时触发计算。

柯里化本身不直接实现“延迟执行”,但它能自然地支持延迟执行——通过分步接收参数,把最终计算推迟到所有参数齐备时才触发。
什么是柯里化(Currying)
柯里化是将一个接收多个参数的函数,转换为一系列每次只接收一个参数的函数的过程。每次调用返回一个新函数,直到参数数量满足原函数要求,才真正执行计算。
例如:add(1, 2, 3) 柯里化后可写成 add(1)(2)(3),而 add(1)(2) 并不计算,只是等待第三个参数。
手动实现加法的柯里化函数
下面是一个支持任意个数参数、自动延迟求值的加法柯里化函数:
function add(a) {
return function(b) {
return function(c) {
return a + b + c;
};
};
}
用法:
add(1)(2)(3); // → 6
const addOne = add(1); // 暂存,不执行
const addOneAndTwo = addOne(2); // 仍不执行
addOneAndTwo(3); // 此刻才算:1 + 2 + 3 = 6
通用柯里化工具函数(支持任意函数)
更实用的方式是写一个通用 curry 工具,让任意数学函数(如 multiply、power)都支持延迟执行:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
} else {
return function(...moreArgs) {
return curried(...args, ...moreArgs);
};
}
};
}
然后定义普通数学函数并柯里化:
const multiply = (a, b, c) => a * b * c;
const curriedMultiply = curry(multiply);
curriedMultiply(2)(3)(4); // → 24
const double = curriedMultiply(2); // 延迟:等两个参数
double(5)(6); // → 60
配合闭包实现带初始值的延迟计算器
如果想先固定部分操作(如“乘以 10 再加 5”),再等输入数据,可以用柯里化 + 闭包组合:
const transform = curry((multiplier, offset, value) => value * multiplier + offset);
const scaleAndShift = transform(10)(5); // 参数已固定两个,只等 value
scaleAndShift(3); // → 35
scaleAndShift(7); // → 75
这种模式非常适合配置化数学管道:运算逻辑提前定义,数值输入时才执行,天然延迟。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











