js 实现函数的柯里化

104 阅读1分钟

一、什么是柯里化函数

函数式语言的工作原理是将多参数函数语法转化为单参数函数集合,这一过程称为柯里化,它是以逻辑学家Haskell Curry的名字命名的。Haskell Curry从早期概念中发展出了该理论。其形式相当于将z = f(x, y)转换成z = f(x)(y)的形式,原函数由两个参数,现在变为两个接受单参数的函数,在函数式编程语言中,这种特性很常见。

二、最简短的代码实现柯里化

思路

  1. 参数收集阶段(递归收集参数):递归收集函数的参数,直到函数的参数足够
  2. 函数调用阶段(调用真正的函数),调用真正的函数,函数真实的执行结果。

具体实现:

/*使用数组存储参数,直到参数数量足够才会真正地调用函数*/
function curry(func, ...args) {
  return function (...args1) {
    const totalArgs = [...args, ...args1]
    /*使用数组存储参数,直到参数数量足够才会真正地调用函数*/
    return totalArgs.length < func.length
      ? curry(func, ...totalArgs) // 参数收集
      : func(...totalArgs) // 函数调用阶段
  }
}

三、 测试

柯里化函数的参数只能刚好等于原函数的参数才会直接调用拿到执行结果,如果少于,会返回一个函数用于继续收集参数,如果多余,就返回函数的执行结果。

function add(a, b, c, d, e) {  
    return a + b + c + d + e;  
}  
const addPlus = currying(add);  
console.log(addPlus(1, 2, 3, 4)(5));

运行结果:

image.png