Вот решение с универсальной функцией variadic curry в ES6 Javascript с предупреждением о том, что для вызова аргументов необходим финальный ()
:
const curry = (f) =>
(...args) => args.length? curry(f.bind(0, ...args)): f();
const sum = (...values) => values.reduce((total, current) => total + current, 0)
curry(sum)(2)(2)(1)() == 5 // true
Вот еще один, которому не нужно ()
, используя valueOf
, как в @ rafael's answer . Я чувствую, что использование valueOf
таким образом (или, возможно, вообще) очень сбивает с толку людей, читающих ваш код, но каждый для своего.
toString
в этом ответе не требуется. Внутренне, когда javascript выполняет приведение типов, он всегда вызывает valueOf()
перед вызовом toString()
.
// invokes a function if it is used as a value
const autoInvoke = (f) => Object.assign(f, { valueOf: f } );
const curry = autoInvoke((f) =>
(...args) => args.length? autoInvoke(curry(f.bind(0, ...args))): f());
const sum = (...values) => values.reduce((total, current) => total + current, 0)
curry(sum)(2)(2)(1) + 0 == 5 // true