Функция _.curry(...)
выглядит довольно странно, когда речь идет о вызове функций с различными параметрами. Позвольте мне привести вам пример, приведенный ниже.
Функция ary (_.ary(..., 2)
) принимает любую функцию и гарантирует, что она никогда не будет вызываться с более чем определенным количеством аргументов (в данном случае два). Меньше аргументов, чем указано, в итоге вызовет базовую функцию с меньшим количеством аргументов. Определение этой функции может выглядеть следующим образом:
function ary() {
const args = arguments;
// implementation
}
Невозможно определить, сколько аргументов ожидает функция, как это было бы с функцией с фактическими параметрами (function(a, b) { }
). Если бы вы определили const forward1 = _.curry(_.ary(target, 2))
и вызвали его с forward1(42)(2)
, функция карри просто передала бы первый аргумент ary
, так как считала, что это сделано.
Мы можем обойти это, используяперегрузка curry
, указывающая, сколько параметров ожидает базовая функция (const forward2 = _.curry(target, 2)
). Только в случае, когда forward2
вызывается в стиле карри (не уверен, что он даже вызван) с двумя параметрами, он передает его до target
. Вызов с одним аргументом просто вернет новую функцию, ожидая вызова со вторым аргументом. Теперь мы можем избавиться от ary
-звука, так как он больше нам не нужен.
Что касается цепочки действий, для этого есть помощник. Например: c(b(a(...)
можно переписать в _.flow([a, b, c])
. Lodash также предоставляет функцию для a + b
, которая составляет _.add()
.
. Вместе вашу проблему можно переписать так:
const forward = _.curry(_.flow([_.add, String.fromCharCode]), 2);
или более подробно:
const methods = _.flow([
_.add,
String.fromCharCode
]);
const forward = _.curry(methods, 2);
Обратите внимание, что 2
соответствует количеству параметров, ожидаемых методом _.add
.