zerolab-fe / one-question-per-day

每天一个小问题
21 stars 7 forks source link

JS函数柯里化 #42

Open GleanCoder1116 opened 4 years ago

li-shuaishuai commented 4 years ago

在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

curry 的这种用途可以理解为:参数复用。本质上是降低通用性,提高适用性。

sum(a, b, c) = sum(a)(b)(c)

var sum = function (a, b, c) {
  return a + b + c
}
var newsum = curry(sum)

// newsum(a,b)(c) newsum(a)(b,c) 柯里化后参数可以任意搭配
function curry(fn, ...arr) {
  return (...args) => {
    // 如果参数个数小于最初的fn.length,则递归调用,继续收集参数
    if ([...arr, ...args].length < fn.length) {
      return curry(fn, ...arr, ...args) // 迭代,传入现有的所有参数
    } else {
      // 参数收集完毕,则执行fn
      return fn(...arr, ...args) // 拓展参数,调用fn
    }
  }
}