最近我在Javascript书中读到了关于函数组合的内容,然后在一个网站上我看到有人将其称为currying。
它们是相同的概念吗?
答案 0 :(得分:15)
@Omarjmh的答案很好,但在我看来,学习者的撰写示例非常复杂
它们是相同的概念吗?
没有
首先,currying将一个将多个参数转换为函数序列的函数进行转换,每个函数都接受一个参数。
// not curried
const add = (x,y) => x + y;
add(2,3); // => 5
// curried
const add = x => y => x + y;
add(2)(3); // => 5
注意应用curried函数的独特方式,一次一个参数。
其次,函数组合是将两个函数组合成一个,当应用时,返回链式函数的结果。
const compose = f => g => x => f(g(x));
compose (x => x * 4) (x => x + 3) (2);
// (2 + 3) * 4
// => 20
这两个概念密切相关,因为它们相互配合良好。通用函数组合使用一元函数(带有一个参数的函数),而curried函数也只接受一个参数(每个应用程序)。
// curried add function
const add = x => y => y + x;
// curried multiplication function
const mult = x => y => y * x;
// create a composition
// notice we only apply 2 of comp's 3 parameters
// notice we only apply 1 of mult's 2 parameters
// notice we only apply 1 of add's 2 parameters
let add10ThenMultiplyBy3 = compose (mult(3)) (add(10));
// apply the composition to 4
add10ThenMultiplyBy3(4); //=> 42
// apply the composition to 5
add10ThenMultiplyBy3(5); //=> 45
答案 1 :(得分:2)
组合和currying用于创建功能。组合和currying在创建新函数的方式上有所不同(通过应用args vs chaining)。
<强>撰写:强>
Compose应返回一个函数,该函数是任意长度函数列表的组合。每个函数都在后面函数的返回值上调用。您可以将compose视为通过其参数从右向左移动。
示例:强>
var compose = function(funcs) {
funcs = Array.prototype.slice.call(arguments, 0);
return function(arg) {
return funcs.reduceRight(function (a, b) {
a = a === null ? a = b(arg) : a = b(a);
return a;
}, null);
};
};
var sayHi = function(name){ return 'hi: ' + name;};
var makeLouder = function(statement) { return statement.toUpperCase() + '!';};
var hello = compose(sayHi, makeLouder);
l(hello('Johhny')); //=> 'hi: JOHNNY!'
<强>柯里:强>
Currying是一种构造函数的方法,允许部分应用函数的参数。
示例:强>
var addOne = add(1);
var addTwo = add(2);
var addOneToFive = addOne(5);
var addTwoToFive = addTwo(5);
l(addOneToFive); //6
l(addTwoToFive); //7
JSBin与上面的例子: https://jsbin.com/jibuje/edit?js,console