什么是“函数柯里化”
curry 的概念:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数
先看一个简单例子,add
函数接受 2 个参数(或者多个),addX
函数接受 1 个参数。
换而言之,所谓”柯里化”,就是把一个多参数的函数,转化为单参数函数。将一个函数转换为一个新的函数
1 | // 非柯里化 |
柯里化的好处
我能想到的是:
- 代码复用,减少维护成本
- 尽可能的函数化,便于阅读
“函数式编程”是一种”编程范式”(programming paradigm),也就是如何编写程序的方法论。
所以,不用想太多,就是一种规范一样的东西~ ~
如何实现柯里化函数 curry
先来看一个栗子(这里借助了ramda
,请自行安装),在下面的栗子中我们对 add 进行了柯里化,从结果上可以看到当参数为 1 个时返回的是个函数,当参数为 2 个的时候返回函数,当参数为 3 个的时候返回函数执行结果
。
1 | var _ = require("ramda"); |
根据上述的小栗子,可以得到,柯里化后的函数
如果接受到全部参数则返回函数执行结果
,否则返回一个柯里化函数
。
很容易想到以下伪代码
1 | var curry = function(fn) { |
上述伪代码是不是很像递归?
- 递归出口:curry_fn接受到的参数数量等于fn接受参数的数量
- 重复逻辑:return “一个柯里化函数”
于是有了以下简单实现柯里化的代码
1 | var curry = function(fn) { |