【问题标题】:Are 'currying' and 'composition' the same concept in Javascript?Javascript中的“currying”和“composition”是同一个概念吗?
【发布时间】:2016-07-16 09:34:51
【问题描述】:

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

它们是同一个概念吗?

【问题讨论】:

  • 它们是相关的概念,但并不完全相同。 compose 是二合一,curry 是预先定义一个的一部分。
  • @dandavis 您能否发布一个概述差异的答案?它们可以用来实现相同的目标吗?
  • 它已经在足够多的地方得到了很好的解释,我无法做到公正。但简而言之:它们是不一样的,所以研究每一个,弄清楚每一个的含义和作用,弄清楚它们如何相互应用,如果它们适用的话。
  • 不太一样:What is Currying,然后分别Function composition in Javascript。柯里化通常是将某些函数参数预先连接到未传递这些参数的新函数中。函数组合是您如何组合多个现有函数来创建一个新函数,该函数通过调用某个compose() 函数来执行另一个函数的某种组合,而不仅仅是手写一个新函数。
  • 您必须提供更多信息才能获得正确答案。

标签: javascript functional-programming composition currying


【解决方案1】:

@Omarjmh 的回答很好,但我认为撰写示例对于学习者来说非常复杂

它们是同一个概念吗?

没有。

首先,柯里化是将一个接受多个参数的函数转换为一系列函数,每个函数接受一个参数。

// not curried
const add = (x,y) => x + y;
add(2,3); // => 5

// curried
const add = x => y => x + y;
add(2)(3); // => 5

请注意应用柯里化函数的独特方式,一次一个参数。


第二,函数组合是将两个函数合二为一,应用时返回链函数的结果。

const compose = f => g => x => f(g(x));

compose (x => x * 4) (x => x + 3) (2);
// (2 + 3) * 4
// => 20

这两个概念密切相关,因为它们相互配合得很好。泛型函数组合适用于一元函数(接受一个参数的函数),而柯里化函数也只接受一个参数(每个应用程序)。

// 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 

【讨论】:

  • 你说的很对,我今天晚些时候再编辑,谢谢
【解决方案2】:

组合和柯里化用于创建函数。组合和柯里化在创建新函数的方式上有所不同(通过应用 args 与链接)。

撰写:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2013-11-25
    相关资源
    最近更新 更多