495 字
2 分钟
函数柯里化
什么是函数柯里化?
TIP **函数柯里化(**curry)是 函数式编程 中的概念。
函数柯里化是指: 每次调用函数时,先接收部分参数,并返回一个函数,然后传递剩下的一部分参数,再返回一个函数,直到传递完所有参数为止,
通俗的讲,函数柯里化就是:
固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩小适用范围,创建一个针对性更强的函数。
函数柯里化的作用(意义)?
:::tip 意义
- 参数复用
- 提前返回
- 延迟执行
:::
解释:
比如,有一个柯里化函数add(最多传入3个参数),add(1,2)(m)的结果就是 1 + 2 + m,
那么只需要 令
fn_1_2 = add(1,2)
,之后只用fn_1_2(m)
,不需要传入1,2进而实现了参数复用
而 提前返回 和 延迟执行 也很好理解,因为每次调用函数时,它只接受一部分参数,并返回一个函数(提前返回),直到(延迟执行)传递所有参数为止。
例子:
add(1)(2)
const add = x => y => x + y;
add(1)(2) // 1 + 2
add(1)(2)(3)
const add = x => y => z => x + y + z;
add(1)(2)(3) // 1 + 2 + 3
WARNING 上面的例子比较简单,都是一个一个参数传入,那么一次传入两个、三个甚至n个参数呢?
实现一个简单的柯里化函数:comet:
:::tip 思路
- curry是用来生成柯里化函数的 工具函数
- 根据传入的参数个数
(args.length)
是否大于原函数所需参数个数(fn.length)
:- 如果大于,就执行当前函数
- 否则,就返回一个curry函数
:::
// 生成柯里化函数的 工具函数
function curry(fn,...args) {
if(args.length >= fn.length){
return fn(...args)
}
return function (..._args) {
return curry(fn,..._args,...args)
}
}
function test1(x,y,z) {
return x + y + z
}
let test = curry(test1)
console.log(test(1, 2, 3));
console.log(test(1, 2)(3));
console.log(test(1)(2, 3));