不定量参数柯里化处理

柯里化(currying)

要理解柯里化,最直观的方式是先从一个非正式的定义入手,之后再将其拓展适配到各种不同的领域。首先,我们需要建立一些符号表示:符号X→Y表示所有从X到Y的函数。若f是这样一个函数,我们记作 f:X→Y。而 X×Y则表示 X和Y中元素的有序对集合,也就是X和Y的笛卡尔积。这里的 X和Y既可以是集合,也可以是类型,或是其他类型的对象。
给定一个函数
f:(X×Y)→Z
柯里化会构造出一个新函数
g:X→(Y→Z)
也就是说,g接收一个类型为 X的参数,并返回一个类型为Y→Z的函数。它的定义如下:
g(x)(y)=f(x,y)
其中 x是类型 X的元素,y是类型Y的元素。我们也可以记作:
curry(f)=g

实现

1
2
3
4
5
6
7
8
function curry(fn){
return function curried(...args){
//当参数数目与原函数参数数目一致时,将参数传入原函数执行
if(args.length>=fn.length) return fn(...args)
//否则迭代执行,并传入原参数与新参数作为下一步迭代的参数
return (...args2)=> curried(...args,...args2)
}
}

使用

对于任何函数,使用curry函数后都能实现柯里化,举例如下:

1
2
3
4
5
6
7
const sum=(a,b,c)=>{
return a+b+c
}
const curriedSum=curry(sum)
console.log(curriedSum(1,2,3)===curriedSum(1)(2,3),
curriedSum(1)(2,3)===curriedSum(1,2)(3),
curriedSum(1,2,3)===curriedSum(1,2)(3))//true,true,true

不定量参数柯里化处理
http://example.com/2026/03/05/不定量参数柯里化处理/
作者
印星
发布于
2026年3月5日
许可协议