Сравнение методов класса и каррирования

Каррированная функция — это просто функция, которая возвращает функцию. Там! Я использовал функцию три раза в одном предложении. Во всяком случае, это правда с модификацией, как мы говорим на моем родном языке. Начнем с того, что не будем приукрашивать вещи.

class Addition {
 constructor(a) {
  this.a = a;
 }
 
 add(b) { // class functions are called methods, don't ask me why.
  return this.a + b;
 }
}

Давайте создадим объект и сделаем некоторые дополнения.

let addition = new Addition(40); // addition.a = 40
addition.add(2); // returns 42

Отлично, мы использовали метод класса для сложения. А теперь давайте приготовим карри!

const addition = a => b => a + b;

Это было просто! Возьмем байт[sic].

addition(40)(2); // returns 42
// OR
let forty = addition(40);
forty(2); // returns 42

Что здесь происходит? Это какая-то магия? Давайте реорганизуем назначение переменной (добавление константы), чтобы было понятнее.

const addition = function(a) {
 return function(b) {
  return a + b;
 }
}

Давайте рассмотрим, что происходит в первом примере.

addition(40)(2); // variable a gets assigned the value 40, and
                 // function(b) is returned. function(b) is invoked 
                 // with the value 2, and therefore returns a + b, 
                 // i.e. 40 + 2;

И второй пример.

let forty = addition(40); // variable a gets assigned the value 40,
                          // and function(b) is returned. I.e. forty
                          // is now a function, and a = 40. 

Давайте напишем код, который делает то же самое, что и выше.

forty = function(b) {
 const a = 40;
 return a + b;
}

Итак, когда вызывается forty(2), происходит вот что.

function(2) {
 const a = 40;
 return 40 + 2; // 42
}

И вот он, ответ на жизнь, вселенную и карри.