一文了解柯里化

首先,什么是柯里化,什么时候会用到柯里化。

柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

很难懂吧,其实白话就是:通过柯里化处理的函数,可以分别传参。例如,test(a,b,c)通过柯里化处理后,可以这样调用:test(a)(b)(c),test(a,b)(c),test(a)(b,c).....

那么什么场景业务会用到柯里化呢?

例如:我们写一个计算商品打折后价格的函数:

after(scale,price){
return price*scale
}复制代码

如果我们知道了其中一个参数是一般情况下不会变化的,例如打折折扣scale。如果使用了柯里化函数我们就可以在不改变打折函数的情况下获得一个计算固定折扣的函数。通过这个函数就可以只填写价格就得到价格。

let after_half_fold = curry(afer,0.5)
复制代码


那么,如果实现一个柯里化函数呢?

首先要知道实现这个函数的核心思想:通过递归函数不断的获取参数,直到获取的参跟传入函数的参数值相等,再通过apply执行原函数。

柯里函数网上有许多大神的实现。但为了方便大家更容易看懂,我手写了一个简陋版的柯里函数,简单易懂。核心思想以及实现方式不变。


let test = function(a, b, c) {  console.log("a:", a, "b:", b, "c:", c);};let curry = function(fun, arg, length) {  arg = [arg] || [];  length = length || fun.length;  return function(...rest) {    if (rest.length >= length - arg.length) {      fun.apply(this, arg.concat(rest));    } else {      curry.apply(this, [fun, arg.concat(rest), length]);    }  };};let curry_t = curry(test, "aaa");curry_t("bbb", "ccc");

复制代码

注释就不写了,已经凌晨两点了。明天还要上班,就这样吧。反正也没人看。


转载于:https://juejin.im/post/5d260062f265da1b672136aa

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值