九、JavaScript专题之偏函数

什么是偏函数

偏函数(Partial application),wiki 上解释:

In computer science, partial application (or partial function application) refers to the process of fixing a number of arguments to a function, producing another function of smaller arity.

翻译成中文:

在计算机科学中,局部应用(或局部函数应用)指将多个参数固定到一个函数上,产生另一个具有较小元数的函数的过程。
什么是元?元是指函数参数的个数,比如一个带有两个参数的函数被称为二元函数。
举个例子:

1
2
3
4
5
6
7
8
9
10
function add(a, b) {
return a + b;
}

add(1, 2); //3

// 假设有一个 partial 函数可以做到局部应用
var addOne = partial(add, 1);

addOne(2); // 3

Partial Application(偏函数应用)很容易和函数柯里化混淆,所以两者到底是有什么区别呢?

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

如果说两者有什么关系的话,引用 functional-programming-jargon 中的描述就是:

Curried functions are automatically partially applied.

即柯里化过的函数会自动生成局部应用。

偏函数实现

实现过程跟柯里化有点相似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function partial(fn, ...args) {
return function (...params) {
return fn.apply(this, [...args, ...params]);
};
}

function add(a, b) {
return a + b + this.value;
}

// var addOne = add.bind(null, 1);
var addOne = partial(add, 1);

var value = 1;
var obj = {
value: 2,
addOne: addOne,
};
obj.addOne(2);
// 使用 bind 时,结果为 4
// 使用 partial 时,结果为 5

参考文献

https://github.com/mqyqingfeng/Blog/issues/43