减少乘法函数

Reduce multiply functions

我找不到更好的标题。事实上,我想问题更多的是关于范围。但我会尽力解释我的问题。我在这里和那里遇到过这样的例子,其中 reduce 方法使用对先前累加器的引用和几步前的当前值来嵌套函数。但这就是我的看法,尽管我一点也不确定。这就是我来这里澄清我的理论的原因。我试图重新阅读有关 reduce、composition 和 scope 的文章,但它们似乎都没有用于类似的场景。也许我毕竟不擅长谷歌搜索。让我们考虑一个 例子 :

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) 是否进入固定 f: n => Promise.resolve(n * 1.2)g: n => Promise.resolve(n * 2)then。然后在调用 h(20) 之后,当 g = n => Promise.resolve(n + 1) 得到解决并且轮到 then 产生时,它将 x => g(x).then(f) 与固定的 fg 解析为我之前提到的功能?

我已尽我所能进行描述,希望您明白我的意思。我只是想了解这种应用程序是如何工作的。我花了一段时间来理解引用如何以正确的方式更改为 fg。这是我想到的唯一一种解释。

这是一个简化的替代评估。我只关注 lambda (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)));

您可以在控制台中运行最终结果,它会产生预期的结果。希望对您有所帮助。