JS函数柯里化

函数柯里化(function currying)。currying 的概念最早由俄国数学家 Moses
Schönfinkel 发明,而后由著名的数理逻辑学家 Haskell Curry 将其丰富和发展,currying 由此得名。
currying 又称部分求值。一个 currying 的函数首先会接受一些参数,接受了这些参数之后,
该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保
存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。

// 非currying 函数的完整实现,但有助于我们了解其思想
var cost = (function(){
  var args = [];
  return function(){
    if ( arguments.length === 0 ){
      var money = 0;
      for ( var i = 0, l = args.length; i < l; i++ ){
        money += args[ i ];
      }
      return money;
    } else{
      [].push.apply( args, arguments );
    }
  }
})();
cost( 100 ); // 未真正求值
cost( 200 ); // 未真正求值
cost( 300 ); // 未真正求值
console.log( cost() ); // 求值并输出:600
// 通用的 function currying(){}
var currying = function( fn ){
  var args = [];
  return function(){
    if ( arguments.length === 0 ){
      return fn.apply( this, args );
    }else {
      [].push.apply( args, arguments );
      return arguments.callee;
    }
  }
};

var cost = (function(){
  var money = 0;
  return function(){
    for ( var i = 0, l = arguments.length; i < l; i++ ){
      money += arguments[ i ];
    }
    return money;
  }
})();

var cost = currying( cost ); // 转化成 currying 函数

cost( 100 ); // 未真正求值
cost( 200 ); // 未真正求值
cost( 300 ); // 未真正求值
alert ( cost() ); // 求值并输出:600

ChatGPT 生成示例:

柯里化是一种将多参数的函数转换为一系列使用一个参数的函数的技术。

// 通用的柯里化函数
function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    } else {
      return function (...moreArgs) {
        return curried(...args, ...moreArgs);
      };
    }
  };
}

// 使用柯里化创建 add 函数
const curriedAdd = curry(function add(a, b, c) {
  return a + b + c;
});

// 柯里化调用
const result = curriedAdd(1)(2)(3);
console.log(result); // 输出 6
posted @ 2023-01-11 17:03  Better-HTQ  阅读(163)  评论(0编辑  收藏  举报