основная проблема в нашем коде заключается в том, что !args
всегда ложно, так как []
для логического значения также true
.
вы должны использовать !args.length
. однако вам следует добавить дополнительный вызов к использованию вашей функции карри, например curried(1)(2, 3)()
.
другой подход использует сравнение числа требуемых параметров в карри-функции (build_sentence.length
) и количества переданных параметров (args.length
), но он не работает со сценарием распространения.
upd:
ex.1 - использование свойства Function.prototype.length
const curry = fn =>
(...args) =>
fn.length <= args.length
? fn(...args)
: curry(fn.bind(this, ...args));
const func1 = (a, b, c) => `${a},${b},${c}`;
const func2 = (...args) => args.join(',');
console.log(curry(func1)(1,3)(4));
console.log(curry(func1)(1,3,4));
console.log(curry(func1)(1)(3)(4));
console.log(curry(func2)(1));
в этом случае карри будет работать нормально для func1
(функция, имеющая перечисляемое количество аргументов), потому что func1.length
= 3. однако для func2
- func2.length
= 0, поэтому (curry(func1))
будет выполнено после первого вызова.
ex.2 - с использованием числа переданных аргументов
const curry = fn =>
(...args) =>
!args.length
? fn()
: curry(fn.bind(this, ...args));
const func = (...args) => args.join(',');
console.log(curry(func)(1)(2,3,4)(5)());
в этом случае функция curry будет возвращать только результат выполнения fn
при вызове без аргументов. однако он будет правильно обрабатывать неисчислимые аргументы функции карри.