HLJ 发布于
2025-06-11 11:41:27
0阅读

JavaScript柯里化概念与实现

JavaScript 柯里化(Currying)

柯里化(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

柯里化的优点

  1. 参数复用:可以固定部分参数,生成更具体的函数
  2. 延迟执行:可以分步传入参数,直到所有参数都传入才执行
  3. 函数组合:便于进行函数组合和管道操作

实际应用示例

// 日志函数柯里化
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

部分应用 vs 柯里化

  • 部分应用:固定函数的部分参数,产生一个更小元的函数
  • 柯里化:将多参数函数转换为一系列单参数函数
// 部分应用
function partial(fn, ...presetArgs) {
  return function(...laterArgs) {
    return fn.apply(this, [...presetArgs, ...laterArgs]);
  };
}

// 柯里化是自动化的部分应用

总结

柯里化是函数式编程中的重要概念,它可以帮助我们创建更灵活、可复用的函数。虽然在实际开发中可能不会频繁使用,但理解这一概念对于掌握函数式编程思想很有帮助。

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/843.html
最后生成于 2025-06-13 16:39:17
此内容有帮助 ?
0