Why You need Currying Function?

为什么需要柯里化函数

什么是柯里化

将使用多个参数的函数转换成一系列使用一个参数的函数

举例来说目前有个建造三明治的函数,通过传入三个参数来构建个三明治:

function makeSandwich(bread, meat, vegetable) {
return `三明治:${bread}、${meat}、${vegetable}`;
}
makeSandwich('黑麦面包', '牛肉', '洋葱'); // 三明治:黑麦面包、牛肉、洋葱

而将函数柯里化的意思就是将这个函数拆成三个函数,每个函数只接受单一参数:

function makeSandwich(bread) {
return function (meat) {
return function (vegetable) {
return `三明治:${bread}、${meat}、${vegetable}`;
};
};
}
makeSandwich('黑麦面包')('牛肉')('洋葱'); // 三明治:黑麦面包、牛肉、洋葱

这么写仍些难阅读,因此可以进一步使用箭头函数来简化:

const makeSandwich = (bread) => (meat) => (vegetable) => `三明治:${bread}、${meat}、${vegetable}`;

这就是函数柯里化,现在明白有这样的酷方法,与其传递参数,改为传递一个个的函数有什么好处呢?

柯里化的好处

更高的复用性

还是举三明治的例子,如果没有完整的传递所有参数,假设只传递了 breeadmeat 参数,那么就会返回一个函数,指示须输入 vegetable 参数:

const ryeBeefSandwich = makeSandwich('黑麦面包')('牛肉');
ryeBeefSandwich(); // vegetable => `三明治:${bread}、${meat}、${vegetable}`
ryeBeefSandwich('洋葱'); // '三明治:黑麦面包、牛肉、洋葱'

这样就创造了一个局部应用(Partially applied)的函数,可以用来构建不同的三明治,而不用每次都传递所有参数。聪明的你已经发现这个超赞的特性可以马上应用在实际的开发中,例如开一家三明治店生产不同种类的三明治:

const whiteBreadBeefSandwich = makeSandwich('白面包')('牛肉');
const ryeChickenSandwich = makeSandwich('黑麦面包')('鸡肉');
// ... 各式各样的三明治模板
whiteBreadBeefSandwich('莴苣'); // '三明治:白面包、牛肉、莴苣'
ryeChickenSandwich('洋葱'); // '三明治:黑麦面包、鸡肉、洋葱'

参考资料