Skip to content

13. 偏函数

偏函数就是将一个 nn 参数的函数转换成固定 xx 参的函数,剩余 nxn - x 个参数将在下次调用全部传入。

样例如下:

js
function add(a, b, c) {
  return a + b + c;
}

const partialAdd = partial(add, 1)
console.log(partialAdd(2, 3))

partial() 函数实现如下:

js
const partial = (fn, ...args) => (...arg) => fn(...args, ...arg)

/**
 * @param {number} a
 * @param {number} b
 * @param {number} c
 */
function add(a, b, c) {
  return a + b + c
}

const partialAdd = partial(add, 1)
console.log(partialAdd(2, 3))

有时候我们想要一个占位符功能,使用 placeholder 占据一个位置,然后在下一次传递即可:

用起来就像这样:

js
function add(a, b, c) {
  return a + b + c;
}

const partialAdd2 = partial(add, 1, placeholder, 3)
console.log(partialAdd(2))

代码实现:

js
const placeholder = Symbol('placeholder')

function partial(fn, ...args) {
  return (...arg) => {
    let curr = 0
    return fn(...args.map(val => (val === placeholder) ? arg[curr++] : val), ...arg.slice(curr))
  }
}

function add(a, b, c) {
  return a + b + c
}

const partialAdd = partial(add, 1)
const partialAdd2 = partial(add, 1, placeholder, 3)
console.log(partialAdd(2, 3))
console.log(partialAdd2(2))