柯里化

467 阅读1分钟

什么是柯里化

柯里化(Haskell Brooks Curry) 是以数学家Haskell Brooks Curry最后一个名字来命名, 晓得不?这个数学家的每一个名字都是一门语言,吼吼....厉害了

  • 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数
  • 这是一种对函数参数的“缓存”
  • 让函数变得更灵活, 让函数的粒度更小
  • 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能

柯里化实现

假设有这样一个函数

const sub = function(a, b, c, d){
    return a+b+c+d
}
const subCurry = curry(sub)
subCurry(1, 2, 3, 4) // 10
subCurry(1)(2)(3)(4) // 10
//或者
subCurry(1)(2,3,4) // 10
//亦或者
subCurry(1,2)(3,4) // 10

那么这个curry方法该如何实现? 如下图所示

function curry(fn){
    return function curriedFn(...args){
        if(args.length < fn.length){ // 如果传入的参数小于函数定义的形参个数,则返回一个函数,用于接收下一个参数
            return function(){
                return curriedFn(...args.concat(Array.from(arguments)))// 将之前传递的参数,与现在调用函数传递的参数合并
            }
        }
        return fn(...args) // 第一种情况 subCurry(1, 2, 3, 4)
    }
}
    

柯里化的案例

寻找数组中元素是否存在空白字符

  const haveSpace = match(/\s+/g)
  const list = ['John Connor', 'John_Donne']

  const filter = curry(function(func, array)){
      return array.filter(func)
  }
  const findSpace = filter(haveSpace)
  console.log(findSpace(list)) // ['John Connor']
    

柯里化在Redux中的应用

未完待续...