到这里,其实我们已经实现了curry函数。
接下来就是要看看怎么写才能更简洁。
首先,中间的代码可以写成一个立即执行函数,省掉一些...arr, ...args:
const curry = ( fn, arr = []) => {
return (...args) => {
return ( a => { //a是一个数组
if(a.length === fn.length) {
return fn(...a)
}else{
return curry(fn, a)
}
})([...arr, ...args]) //这里把arr和args摊开成一个数组赋值给a
}
}
if语句可以缩减成三元表达式,也可以省掉很多字啦:
const curry = ( fn, arr = []) => {
return (...args) => {
return ( a => {
return a.length === fn.length ? fn(...a) : curry(fn, a)
})([...arr, ...args])
}
}
最后,既然函数里啥事都没干,就只是return的话,不妨使用箭头函数最省的写法 input => output, 把return和大括号都给省了:
const curry = ( fn, arr = []) => {
return (...args) => {
return ( a => a.length === fn.length? fn(...a) : curry(fn, a))([...arr, ...args]) //先折叠一层
}
}
再折叠:
const curry = ( fn, arr = []) => {
return (...args) => ( a => a.length === fn.length? fn(...a) : curry(fn, a))([...arr, ...args]) //再折叠
}
收工了收工了:
const curry = ( fn, arr = []) => (...args) => ( a => a.length === fn.length? fn(...a) : curry(fn, a))([...arr, ...args])
//衣服给您叠好了
拿去试试:
const curry = ( fn, arr = []) => (...args) => ( a => a.length === fn.length? fn(...a) : curry(fn, a))([...arr, ...args])
let curryPlus = curry((a,b,c,d)=>a+b+c+d)
curryPlus(1,2,3)(4) //返回10
curryPlus(1,2)(4)(3) //返回10
curryPlus(1,2)(3,4) //返回10
当然了,柯里化函数的主要作用还是延迟执行,执行的触发条件不一定是参数个数相等,也可以是其他的条件,例如参数个为0的情况,那么我们需要对上面curry函数稍微做修改:
const curry = ( fn, arr = []) => (...args) => ( (a,b) => b.length === 0? fn(...a) : curry(fn, a))([...arr, ...args],[...args])
let curryPlus = curry((...x)=>x.reduce((a,b)=>a+b))
curryPlus(1) //返回一个函数
curryPlus(1)(2) //返回一个函数
//遇到参数个数为0的情况才执行
curryPlus(1)(2)(4)() //返回7
curryPlus(1,2)(4)() //返回7
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。










