-

定义

区别

偏函数 (Partial application)

在计算机科学中,局部应用是指固定一个函数的一些参数,然后产生另一个更小元的函数。(什么是元?元是指函数参数的个数,比如一个带有两个参数的函数被称为二元函数。)

局部应用则是固定一个函数的一个或者多个参数,也就是将一个 n 元函数转换成一个 n - x 元函数。

柯里化 (Currying)

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

柯里化是将一个多参数函数转换成多个单参数函数,也就是将一个 n 元函数转换成 n 个一元函数。

原函数

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

console.log(add(1, 2, 3)); // 6

偏函数

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

console.log(add(1)(2, 3)); // 6

柯里化

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

console.log(add(1)(2)(3)); // 6

// 偏函数
function partial(func, ...presetArgs) {
return function (...args) {
return func.call(this, ...presetArgs, ...args);
};
}

const partialAdd = partial(add, 1);

console.log(partialAdd(2, 3)); // 6

// 柯里化
function curry(func, ...presetArgs) {
return function (...args) {
const allArgs = [...presetArgs, ...args];

if (allArgs.length >= func.length) {
// 如果参数大于等于函数参数,那么允许函数提供全部参数被正常调用
return func.apply(this, allArgs);
} else {
// 提供参数小于函数参数,返回偏函数
return curry.call(null, func, ...allArgs);
}
};
}

const curryAdd = curry(add);
console.log(curryAdd(1)(2)(3));