正在cur'和'组成' Javascript中的相同概念?

时间:2016-03-29 01:40:39

标签: javascript functional-programming composition currying

最近我在Javascript书中读到了关于函数组合的内容,然后在一个网站上我看到有人将其称为currying。

它们是相同的概念吗?

2 个答案:

答案 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