[函数式编程] 什么是柯里化?

105 阅读1分钟

柯里化函数(Currying)是一种函数式编程技巧,它把一个接收多个参数的函数,转换成一系列只接收单一参数的函数。换句话说,原来你可能写 fn(a, b, c),柯里化之后,就变成了 fn(a)(b)(c)

举个例子

function add(a, b, c) {
  return a + b + c;
}

add(1, 2, 3); // 6

柯里化后:

function curryAdd(a) {
  return function (b) {
    return function (c) {
      return a + b + c;
    };
  };
}

curryAdd(1)(2)(3); // 6

柯里化工具函数

上述例子,我们手动创建了一个柯里化函数curryAdd。但是,更好的方式是,使用工具函数柯里化原始函数。

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      // Enough arguments → call the original function
      return fn.apply(this, args);
    } else {
      // Not enough arguments → return a new function
      return function (...nextArgs) {
        return curried.apply(this, args.concat(nextArgs));
      };
    }
  };
}

const curryAdd = curry(add);
curryAdd(1)(2)(3)

如上代码,curry就是工具函数,它接受一个原始函数,并返回一个新函数curried。在curried函数中,当接收的参数长度小于原始函数长度时,返回一个合并参数的新函数。否则,使用合并完的参数,调用原始函数。

通用的curry工具函数,可以柯里化任意函数,无需再手动为特定函数编写柯里化函数。

阅读到这里,你大概会有为什么要柯里化的疑惑,那我们一起来继续探讨一下这个问题。