柯里化
功能介绍
柯里化是拆分函数的一种手段,允许我们以偏函数的方式调用这个函数。
比如说,原来的函数A必须传入三个参数才能运行。经过柯里化处理之后的函数KA传入三个参数,能成功运行;传入两个参数也能,但是会返回一个需要传入一个参数才能运行的函数KB,在KB中传入剩下的一个参数后,能得到在A中传入三个才能得到的结果。
这么讲很抽象吧,我们举一个例子
创建一个sum函数
现在我可以使用这个函数进行计算了。但是如果说我现在有100个计算式,这100个前面的两个被加数都是1,2,那我有没有必要调用这个函数传100个1,2呢
很明显是没有必要的。
如果我们将这个函数柯里化一下,得到新的函数
我们就会发现哇塞这个新函数想怎么用就怎么用了。
这个就是柯里化的实质,他把函数拆,将函数的粒度调小了,使得我们的代码复用性大大增加
实现原理
我们来看功能猜实现,猜一下这个柯里化函数是做了什么操作。
首先,函数柯里化是手动将函数内部实现的功能按一个参数一个参数的拆分了吗?
既然函数里化是一种加工函数方式,那么对所有函数都是适用的,这就导致他不涉及函数的执行思路,只和函数的参数个数有关
那么他就不是在拆功能了,那是在拆什么呢?
函数柯里化允许我们以偏函数方式调用,这说明其能自由的处理任意传入的参数。相当于你每次传入的参数都会被存起来,只有当所有参数都传满的时候才会被调用。
那么柯里化之后的函数,如果参数没传满,返回的肯定也是一个函数。
那么我们就有大概的思路了:首先要解决之前传入的参数在新的返回的函数中能使用,这说明他里面肯定在利用闭包(又是闭包)。
其次,如果没传满就一直按照原本方式传,传满了就执行,这个也很明显了,肯定就是递归,以传满为递归条件结束进行返回。
那么思路就很清晰了,就是递归+闭包。
代码
其实还是比较简单的,除去注释代码只有11行。
支持占位符的柯里化
上一个函数柯里化还是有痛点的,那就是他仅支持顺序传入参数
还是那个add的例子,如果说现在我传入的1,2位于第二,三个参数的位置,这个柯里化函数还能用吗?
完蛋了,又要重新开始加100遍。
那么我们就需要一种更加灵活的柯里化方式,支持我们乱序传入参数,暂时不能确定的参数,传一个空格。
其实也很简单,在刚刚代码的基础上加上一个参数串中是否有占位符的判断和参数置换逻辑就好了
从这个上面其实还可以引申出更多柯里化变式,比如支持参数校验的柯里化,检测剩余参数的柯里化等等,不过基本思想和这个例子一致,使用正则等手段匹配校验一下就好了。