柯里化(Currying)是一种将多参数函数转换为一系列单参数函数的技术,它由数学家 Haskell Curry 命名。
柯里化是指将一个接受多个参数的函数转换为一系列只接受一个参数的函数的过程。例如:
// 原始函数
function add(a, b, c) {
return a + b + c;
}
// 柯里化后的函数
function curriedAdd(a) {
return function(b) {
return function(c) {
return a + b + c;
};
};
}
// 使用方式
add(1, 2, 3); // 6
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(...args2) {
return curried.apply(this, args.concat(args2));
};
}
};
}
// 使用示例
const curriedAdd = curry(function(a, b, c) {
return a + b + c;
});
console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1)(2, 3)); // 6
// 日志函数柯里化
function log(date, type, message) {
console.log(`[${date.getHours()}:${date.getMinutes()}] [${type}] ${message}`);
}
const curriedLog = curry(log);
// 固定日期参数
const logNow = curriedLog(new Date());
// 固定类型参数
const logNowWarning = logNow('WARNING');
// 使用
logNowWarning('This is a warning'); // [14:30] [WARNING] This is a warning
// 部分应用
function partial(fn, ...presetArgs) {
return function(...laterArgs) {
return fn.apply(this, [...presetArgs, ...laterArgs]);
};
}
// 柯里化是自动化的部分应用
柯里化是函数式编程中的重要概念,它可以帮助我们创建更灵活、可复用的函数。虽然在实际开发中可能不会频繁使用,但理解这一概念对于掌握函数式编程思想很有帮助。