Лодаш способ создания пользовательской функции - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь реализовать простую функцию в чистом виде.

function forward(i) => {
  return (j) => {
    return String.fromCharCode(i + j)
  }
}

Чтобы я мог сделать _.range(26).map(forward(65)). Уделите мне немного времени, чтобы сделать эту работу:

function a = _.wrap(String.fromCharCode, (fn, a, b) => fn(a + b))
function b = _.ary(a, 2)
function forward = _.curry(b)

Теперь мой вопрос: есть ли более простой способ сделать это? и как я могу использовать sum для создания (fn, a, b) => fn(a + b)? И последнее, что я не могу найти файл функции переноса в репозитории lodash, кто-нибудь может помочь?

1 Ответ

2 голосов
/ 26 октября 2019

Функция _.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.

...