1.2函数式编程中的柯里化

1. 什么是柯里化(Haskell Brooks Curry)

柯里化(Curring)

  • 当一个函数有一个以上参数传递的时候,先使用一个函数调用部分参数(这部分参数以后永远不变)
  • 再返回一个新的函数接受剩余的参数并且返回计算结果
// 待改造的函数
// function checkAge(min, age) {
//   return age >= mini;
// }

function checkAge(min) {
  return function(age) {
    return age >= min;
  };
}

const checkAge18 = checkAge(18);
const checkAge20 = checkAge(20);

console.log(checkAge18(20));
console.log(checkAge18(22));
console.log(checkAge20(24));

const checkAgeCurry = min => age => age >= min;

2. lodash 中的柯里化方法

const _ = require('lodash');

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

const curried = _.curry(getSum);

console.log(curried(1, 2, 3));
console.log(curried(1)(2, 3));
console.log(curried(1, 2)(3));
console.log(curried(1)(2)(3));
console.log(curried(1)()(2)(3))

3.1 正则表达式的重用

const _ = require('lodash');

const match = _.curry(function(reg, str) {
 return str.match(reg);
});

const haveSpace = match(/\s+/g);
console.log(haveSpace('hello world'));
console.log(haveSpace('helloworld'));

const haveNumber = match(/\d+/g);
console.log(haveNumber('abc'));
console.log(haveNumber('abc123'));

3.2 正则表达式和 array.filter 函数组合使用

const _ = require('lodash');

const match = _.curry(function(reg, str) {
  return str.match(reg);
});

const haveSpace = match(/\s+/g);
console.log(haveSpace('hello world'));
console.log(haveSpace('helloworld'));

const haveNumber = match(/\d+/g);
console.log(haveNumber('abc'));
console.log(haveNumber('abc123'));

console.log('-------------------------')

const filter = _.curry(function(func, array) {
  return array.filter(func);
});

console.log(filter(haveSpace, ['John Connor', 'John Donne']))

const findSpace = filter(haveSpace);
console.log(findSpace(['John Connor', 'John Donne', '123', '-=.,<>']))

const findNumber = filter(haveNumber)
console.log(findNumber(['abc123', 'lgz456', '-=osiap']))

4. 模拟 lodash 中的柯里化函数

function curry(func) {
  return function curriedFn(...curriedFnArgs) {
    // 实参和形参的个数比较
    if (curriedFnArgs.length < func.length) {
      return function(...args) {
        return curriedFn(...curriedFnArgs.concat(args));
      };
    }
    return func(...curriedFnArgs);
  };
}


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

const curried = curry(getSum);

console.log(curried(1, 2, 3));
console.log(curried(1)(2, 3));
console.log(curried(1, 2)(3));
console.log(curried(1)(2)(3));
console.log(curried(1)()(2)(3))

5. 总结

  • 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的心函数
  • 这是一种对函数参数的“缓存”
  • 让函数变得更灵活,让函数的粒度更小
  • 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值