【问题标题】:Reduce multiply functions减少乘法函数
【发布时间】:2020-10-05 22:18:18
【问题描述】:

我没有找到更好的标题。事实上,我猜这个问题更多的是关于范围。但我会尝试解释我的问题。我在这里和那里遇到过这样的例子,其中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。这是我想出的唯一一种解释。

【问题讨论】:

  • 我无法遵循您的描述,但减少形成以下计算g(20).then(f).then(z)
  • 当我调用 h(20) 时,它在闭包中具有以下函数:g: n => Promise.resolve(n + 1)f: x => g(x).then(f)。这是否意味着它最终会变成g(x).then(g(x).then(f))?这似乎是合乎逻辑的,我今天重新创建了这个场景并且它有效。我只是想了解这个链接是如何创建的。因为正如我在上面指出的那样,我认为它是嵌套的。

标签: javascript monads reduce composition currying


【解决方案1】:

这是一个简化的替换评估。我只关注 lambda (f, g) => x => g(x).then(f) 并省略了 reduce-machinery。我还更改了一些名称(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)));

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

【讨论】:

  • 是的,这就是我最终想到的,即使我不擅长解释哈哈。非常感谢您的耐心和这样一个很好的例子!
猜你喜欢
  • 2023-03-30
  • 2018-03-07
  • 2018-12-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多