JSFiddle - React, Tailwind, and code Playground

by Valentin Sarychev

JavaScript

// Задача. Написать такую add, чтобы 0 + add(x1)(x2)(...)(xn) => сумма всех xi.

// это то, что получилось вчера
function mutableAdd(x) {
    var sum = x;
    function f(y) {
        sum += y;
        return f;
    };
    f.valueOf = function() {
        return sum;
    };
    return f;
}

// а так было бы круче
function immutableAdd(x) {
    function f(y) {
        return immutableAdd(x + y);
    };
    f.valueOf = function() {
        return x;
    };
    return f;
}

function runExample(add) {
    // с базисом add
    var v1 = add(1);
    
    // с базисом v1
    var v3 = v1(1)(1);
    var v2 = v1(1);
    
    // с базисом v3
    var v5 = v3(2);
    var v4 = v3(1);
    
    console.log(add.name, v1, v2, v3, v4, v5);
}

// В mutableAdd каждый вызов меняет и возвращает старое состояние
runExample(mutableAdd);

// В immutableAdd каждый вызов создает и возвращает новое состояние
runExample(immutableAdd);