Ответы пользователя по тегу JavaScript
  • Как реализовать вариадическую чистую функцию без классов типов?

    @thewizardplusplus Автор вопроса
    Пока описал задачу, сам понял, как её нужно решать. ))

    function add(x) {
    	return function(y) {
    		return x + y;
    	};
    }
    
    function sum(a) {
    	return function(b) {
    		if (b) {
    			return sum(add(a)(b));
    		} else {
    			return a;
    		}
    	};
    }
    
    sum(1)(2)(3)(4)(5)() === 15


    function cons(x) {
    	return function(y) {
    		return [x, y];
    	};
    }
    
    function list(a) {
    	return function(b) {
    		if (b) {
    			return list(cons(a)(b));
    		} else {
    			return a;
    		}
    	};
    }
    
    list(1)(2)(3)(4)(5)() === [[[[1, 2], 3], 4], 5]


    Update

    Скорректированный код для второго случая, возвращающий более каноничный вид списка:

    function cons(x) {
      return function(y) {
        return [x, y];
      };
    }
    
    function list(a) {
      return function(b) {
        if (typeof b !== 'undefined') {
          if (a instanceof Array) {
              return list(cons(b)(a));
          } else {
              return list(cons(b)(cons(a)('NIL')));
          }
        } else {
          return a;
        }
      };
    }
    
    list(1)(2)(0)(4)(5)() === [5,[4,[0,[2,[1,"NIL"]]]]]


    Хотя список всё равно создаётся в обратном порядке.
    Ответ написан
    Комментировать