1 介绍
函数柯里化(Currying)是一种在计算机科学中常见的技术,特别是在函数式编程中广泛应用。它的核心思想是将接受多个参数的函数,转换为接受单个参数的函数链式调用。这意味着,原本的多参数函数可以通过一系列单参数函数的调用来实现。
如下所示接收两个参数的求和函数,以及柯里化后的求和函数:
function sum(a, b){
return a + b
}
console.log(sum(4, 4))
// curring funciton
function csum(a){
return (b) => {
return a + b
}
}
console.log(csum(2)(5))
// more parameters
function mcsum(a){
return (b) => {
return (c) => {
return a + b + c
}
}
}
const res = mcsum(1)(2)(3)
console.log(res)
2 函数柯里化的优化
优化柯里化函数,使其能够在一次调用或者多次调用中不仅仅传入一个参数,可以传入任意参数,只要传递参数满足要求后执行求和,如下所示(存在副作用):
// optimize the curring function, sum(1)(2,3)(3,4,5)
// side effect
const num = []
function sum(...args){
num.push(...args)
if(num.length >= 5){
return num.slice(0, 5).reduce((p, v) => {return p + v}, 0)
}
return sum
}
const res = sum(1)(2, 3)(4, 5)
console.log(res)
3 函数柯里化的继续优化
2中的柯里化函数存在副作用,使用函数闭包创建一个maker函数隐层num且可以定制求和的参数数量,如下所示:
function sumMaker(length){
let num = []
function sum(...args){
num.push(...args)
if(num.length >= length){
const res = num.slice(0, length).reduce((p, v) => {return p + v}, 0)
num = []
return res
}
return sum
}
return sum
}
const sum3 = sumMaker(3)
console.log(sum3(1, 2)(3, 4))
4 函数柯里化的简单应用
如下所示,我们可以用柯里化maker批量创建判断类型的函数:
// apllication example (axios)
// function isTypeMaker(type){
// return (val) =>{
// return typeof val === type ? true : false
// }
// }
// siple example
const isTypeMaker = type => val => typeof val === type ? true : false
const isUndefined = isTypeMaker("undefined")
const isFunction = isTypeMaker("function")
const isNumber = isTypeMaker("number")
console.log(isUndefined(undefined))
console.log(isFunction(1))
console.log(isNumber(10))