返回

进击的柯里化,简洁手写代码,过目难忘!

前端

柯里化是一种函数式编程中的转换过程,该过程将一个多参数的函数转换为多个单参数的函数。

柯里化函数的本质是通过参数化和组合来达到减少参数个数的目的。换句话说,将一个 n 个参数的函数转换为 n 个一元函数的组合,这样可以通过一系列的函数调用来实现原本需要一次性传入所有参数的情况。

通俗的解释是,柯里化将函数输入参数分组,并将函数拆分为一系列函数的组合,每个函数只处理一个参数。

在 JavaScript 中,柯里化函数非常简单,我们可以使用 bind 方法来实现。下面是确定参数数量的柯里化函数示例:

function curry(fn, ...args) {
  const arity = fn.length;
  return function curried(...args2) {
    const combined = [...args, ...args2];
    if (combined.length >= arity) {
      return fn(...combined);
    } else {
      return curried.bind(null, ...combined);
    }
  };
}

const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);

console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1, 2, 3)); // 6

第二个例子是不确定参数数量的柯里化函数,可以使用 rest 参数来实现:

function curry(fn) {
  const arity = fn.length;
  return function curried(...args) {
    if (args.length >= arity) {
      return fn(...args);
    } else {
      return curried.bind(null, ...args);
    }
  };
}

const add = (...args) => args.reduce((a, b) => a + b, 0);
const curriedAdd = curry(add);

console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1, 2, 3)); // 6
console.log(curriedAdd(1, 2, 3, 4)); // 10
console.log(curriedAdd(1, 2, 3, 4, 5)); // 15

函数柯里化是一种非常有用的技术,它可以帮助我们编写出更简洁、更易维护的代码。希望本文对您理解函数柯里化有所帮助。