Динамический карринг и как держать как функцию и значение переменной JavaScript

голоса
4

Я учусь JavaScript, и я недавно наткнулся на проблемы практики , которые попросили меня построить функцию , которая может создать выходные сигналы следующим образом :

var threeSum= sum(3);
threeSum //3
threeSum(4) //7
threeSum(4)(3) //10
threeSum(4)(3)(7) //17
threeSum(4)(3)(7)()(2) //19
threeSum - 2 //1
threeSum + 2 //5

Я предполагаю, что выделка вовлечена, и я думаю, что у меня есть основное понимание того, как Карринг работ в простой форме что-то вроде

a=>b=>c=> a+b+c

но я не имею ни малейшего представления о том, как я хотел бы создать выделанной функцию, способную обрабатывать неопределенное число входов, ни как сделать это таким образом, что это может привести к переменной, которая может выступать в качестве как значения и функции.

Любое понимание ценится! Мне просто нужен толчок в правильном направлении - в этот момент я даже не знаю, что я ищу больше.

Задан 29/05/2016 в 19:16
пользователем
На других языках...                            


2 ответов

голоса
1

Как указано в комментариях вы не можете определить переменную, которая действует как число и функции одновременно.

Для того, чтобы снискать VARIADIC функции, которые вы должны пройти Арность в явном виде:

const curryN = n => f => {
  let next = (m, acc) => x => m > 1 ? next(m - 1, acc.concat([x])) : f(...acc, x);
  return next(n, []);
};

const sum = (...args) => args.reduce((acc, x) => acc + x, 0);

sum(1, 2, 3, 4, 5); // 15
curryN(5)(sum)(1)(2)(3)(4)(5); // 15

let sum3 = curryN(3)(sum);
sum3(1)(2)(3); // 6

let sum5plusX = curryN(2)(sum)(5);
sum5plusX(6); // 11

Я бы рекомендовал не использовать VARIADIC функции на всех. Используйте Array.reduceвместо этого. Вот интересный учебник о выделке . Это тема в глубину.

Ответил 29/05/2016 в 19:28
источник пользователем

голоса
3

Хитрость здесь в том , что вам нужно определить valueOf, что позволяет Javascript интерпретировать объект (например , функции) в качестве значения:

var valueAndCallable = function(x) {
    var res = function(a) { return a + x };
    res.valueOf = function() { return x; };
    return res;
};

var v = valueAndCallable(1)
console.log(v);      // function ... -
console.log(+v);     // 1 - calls .valueOf()
console.log(1 + v);  // 2 - calls .valueOf()
console.log(v(3));   // 4

Для выделки, вы просто хотите , чтобы res()также возвращать valueAndCallable.

Ответил 29/05/2016 в 19:28
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more