Сравнение методов класса и каррирования
Каррированная функция — это просто функция, которая возвращает функцию. Там! Я использовал функцию три раза в одном предложении. Во всяком случае, это правда с модификацией, как мы говорим на моем родном языке. Начнем с того, что не будем приукрашивать вещи.
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 }
И вот он, ответ на жизнь, вселенную и карри.