减少乘法函数

问题描述 投票:0回答:1

我没有找到更好的题目。其实,这个问题更多的是关于范围的问题吧。但我会试着解释我的问题。我在这里和那里遇到过这样的例子,一个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) 进场 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) 有固定 fg 到我之前提到的功能?

我已经尽量描述得很详细了,希望你能明白我的意思。我只是想了解这种应用是如何工作的。我花了点时间去理解引用是如何改变成的。fg 以正确的方式。这是我想到的唯一一个解释。

javascript monads reduce composition currying
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.