乐趣区

关于javascript:js函数式编程之函数柯里化

1. 柯里化实现

柯里化就是将承受多个参数的函数转化成承受单个参数的函数
柯里化后能够生成便捷函数 / 偏函数

// 以一个理论需要为例:动静生成表格列, 增加到固定的表格列中,组成残缺的表格列
function composeCols(a, b) {a.splice(-1, 0, ...b);
    return a;
}

function curry(f) {return function (fixedCols) {  // 包装器 1
        return function (dynamicCols) {   // 包装器 2
            const fCols = JSON.parse(JSON.stringify(fixedCols));
            return f(fCols, dynamicCols)
        }
    }
}

const curriedFunc = curry(composeCols);
const getCompleteCols = curriedFunc([{name: 'a', value: 1}, {name: 'b', value: 2}]);
console.log(getCompleteCols([{"name":"c","value":3}])); 
//  [{"name":"a","value":1},{"name":"c","value":3},{"name":"b","value":2}]
console.log(getCompleteCols([{"name":"d","value":4}]));
//  [{"name":"a","value":1},{"name":"d","value":4},{"name":"b","value":2}]

// curriedFunc、getCompleteCols 就是两个包装器,也能够了解成就是更简短的 "偏利用函数(partially applied function)" 或 "偏函数(partial)"
// getCompleteCols 为下一步 "生成残缺的表格列" 提供了便捷函数
  1. 高级柯里化
// 以 lodash 为例
function sum(a, b) {return a + b;}

let curriedSum = _.curry(sum);
// curriedSum 包装器容许函数被失常调用或者以偏函数(partial)的形式调用:alert(curriedSum(1, 2));
alert(curriedSum(1)(2));
  1. 高级柯里化实现
function sum(a, b, c) {return a + b + c;}

function curry(func) {return function curried(...args) {if (args.length >= func.length) {return func(...args);
            // return func.apply(this, args);
        } else {return function (...args2) {return curried.apply(this, args.concat(args2));
                // return curried(...args.concat(args2));
            }
        }
    }
}

const curriedSum = curry(sum);
console.log(curriedSum(1, 2, 3, 4)); // 6,能够被失常调用
console.log(curriedSum(1)(2,3)); // 6,对第一个参数的柯里化
console.log(curriedSum(1)(2)(3)); // 6, 齐全柯里化

总结

  • 柯里化通常放弃该函数能够被失常调用且参数数量有余时返回偏函数,即高级柯里化
  • 柯里化通常针对具备固定数量参数的函数
退出移动版