柯里化(Haskell Brooks Curry)
- 解决硬编码的问题
- 原理:当一个函数有多个参数的时候,先传递一部分参数调用它(这部分参数以后永远不变) 然后返回一个新的函数接收剩余的参数,返回结果
- 作用:可以将任意多元函数,转化成一元函数
简单的柯里化理解
function curry(min) {
return function(age) {
return age <= min;
}
}
let info = curry(18); // 提取并储存一个参数,方便后面函数调用时,不用反复传入相同参数
info(16) //true
info(20) // false
let curry = (min) => (age => age <= min);
curry(18)(16); // true
柯里化案例
const match = _.curry(function (reg, str) {
return str.match(reg)
})
const haveSpace = match(/\s+/g)
const haveNumber = match(/\d+/g)
const filter = _.curry(function (func, array) {
return array.filter(func)
})
const findSpace = filter(haveSpace)
console.log(filter(haveSpace, ['John Connor', 'John_Donne']))
console.log(findSpace(['John Connor', 'John_Donne']))
模拟loadsh函数库中的curry函数【curry方法可将函数变为柯里化函数】
function getSum(a, b, c) {
return a + b + c;
}
function curry(func){
return function curriedFn(...args){
//判断实参和形参的个数
if(...args.length < func.length) {
return function () {
return curriedFn(...args.contact(Array.from(arguments)))
}
}
return func(...args)
}
}
//补充:func.length可以获得函数形参的个数,也就是getSum的个数
let curried = curry(getSum)
console.log(curried(1, 2, 3))
console.log(curried(1)(2, 3))
console.log(curried(1, 2)(3))
函数柯里化总结
- 柯里化可以让我们给一个函数传递较少的参数,得到一个已经记住了某些固定参数的新函数 • 通过闭包,对函数参数进行缓存
- 让函数变得更灵活,让函数的粒度更小
- 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能