Уменьшить функции умножения - PullRequest
0 голосов
/ 16 июня 2020

Я не нашел лучшего названия. На самом деле, я думаю, вопрос больше в сфере охвата. Но я постараюсь объяснить свою проблему. Я встречал здесь и там примеры, когда метод reduce выполняет вложенные функции со ссылкой на предыдущий аккумулятор и текущее значение, которое было несколькими шагами a go. Но это то, как я это вижу, хотя я совсем не уверен. Вот почему я пришел сюда, чтобы прояснить свою теорию. Я пытался перечитать статьи о сокращении, составе и объеме, но все они, похоже, не используются в аналогичном сценарии ios. Может, я все-таки плохо гуглил. Давайте рассмотрим пример :

const composePromises = (...ms) => 
    ms.reduce((f, g) => x => g(x).then(f));

const g = n => Promise.resolve(n + 1);
const f = n => Promise.resolve(n * 2);
const z = n => Promise.resolve(n * 1.2);

const h = composePromises(z, f, g);

h(20);

Итак, вопрос: соответствует ли x => g(x).then(f) go then с фиксированными f: n => Promise.resolve(n * 1.2) и g: n => Promise.resolve(n * 2). Затем после вызова h(20), когда g = n => Promise.resolve(n + 1) был разрешен и настала очередь then, он разрешает x => g(x).then(f) с фиксированными f и g для функций, о которых я упоминал ранее?

Я попытался описать как можно более mu sh, и надеюсь, вы поняли мою мысль. Я просто хочу понять, как работают такие приложения. Я потратил некоторое время, чтобы понять, как ссылки изменяются на f и g правильным образом. И это единственное объяснение, которое я придумал.

1 Ответ

1 голос
/ 17 июня 2020

Вот упрощенная оценка замены. Я сосредотачиваюсь только на лямбде (f, g) => x => g(x).then(f) и опускаю reduce -машину. Я также изменил некоторые имена (acc означает аккумулятор, но по-прежнему является функцией):

const composePromises = (...ms) => 
  ms.reduce((acc, f) => x => f(x).then(acc));

const myg = n => Promise.resolve(n + 1);
const myf = n => Promise.resolve(n * 2);
const myz = n => Promise.resolve(n * 1.2);

// first reduction step:
(acc, f) => x => f(x).then(acc); // apply acc with myz and f with myf
// intermediate result:
const acc_ = x => (n => Promise.resolve(n * 2)) (x).then(n => Promise.resolve(n * 1.2));

// second reduction step:
(acc, f) => x => f(x).then(acc); // apply acc with acc_ and f with myg
// final result:
const foo =
  x => (n => Promise.resolve(n + 1)) (x)
  .then(x =>
    (n => Promise.resolve(n * 2)) (x)
    .then(n => Promise.resolve(n * 1.2)));

Вы можете запустить окончательный результат в консоли, и он даст ожидаемый результат. Надеюсь, это поможет.

...