柯里化函数

145 阅读2分钟

柯里化

一、柯里化概念的理解

1. 柯里化也是属于函数式编程里面一个非常重要的概念

是一种关于函数的高阶技术

它不仅被用于 JavaScript,还被用于其他编程语言

2. 维基百科的解释:

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化;

是把接收多个参数的函数,变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新函数的技术

柯里化声称 “如果你固定某些参数,你将得到接受余下参数的一个函数”

3. 总结:

只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数

这个过程就称之为柯里化

4. 柯里化是一种函数的转换,将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)

柯里化不会调用函数。它只是对函数进行转换

//未柯里化的函数
function add1(x, y, z) {
  return x + y + z
}
console.log(add1(10, 20, 30))

//柯里化处理的函数
function add2(x) {
  return function(y) {
    return function(z) {
      return x + y + z
    }
  }
}
console.log(add2(10)(20)(30))

//代码优化
const add3 = x => y => z => x + y + z
console.log(add3(10)(20)(30))

二、柯里化的优势

1. 函数的职责单一

与以往的处理不同, 以往将所有参数交由一个函数处理, 柯里化是一个函数处理一个参数, 实现了函数处理的问题变得单一

2. 复用函数的参数逻辑

function makeAdder(num) {
  return function(count) {
    return num + count
  }
}

const add5 = makeAdder(5)
add5(10)
add5(100)

const add10 = makeAdder(10)
add5(10)
add5(100)

makeAdder函数要求我们传入一个num, 在之后使用返回的函数时,我们不需要再继续传入num了

三、实现自动柯里化函数

将普通函数转成柯里化函数

function currying(fn) {
  function curried(...args) {
    return fn.apply(this, args)
  } else {
    return function(...args2) {
      return curried.apply(this, arg.concat(args2))
    }
  }
  
  return curried
}