【发布时间】: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) 与固定的f 和g 解析为我之前提到的函数?
我已经尽可能地描述了我的意思,希望你明白我的意思。我只是想了解这种应用程序是如何工作的。我花了一段时间来理解引用如何以正确的方式更改为 f 和 g。这是我想出的唯一一种解释。
【问题讨论】:
-
我无法遵循您的描述,但减少形成以下计算
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