关于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, 齐全柯里化

总结

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理