gpt4 book ai didi

typescript - 将一些异步任务链接到fp-ts中,以保留每个任务的结果

转载 作者:行者123 更新时间:2023-12-03 16:28:15 39 4
gpt4 key购买 nike

在fp-ts中,我试图将一些可能失败的异步任务与TaskEither链接在一起,但是我需要在链的后面使用中间任务的结果。

在此示例中:

const getFoo = (a: string): Promise<Foo> => {};
const getBar = (foo: Foo): Promise<Bar> => {};
const mkFooBar = (foo: Foo, bar: Bar): Promise<FooBar> => {};

const async main1: Promise<FooBar> => {
const a = "a";
const foo = await getFoo(a);
const bar = await getBar(foo);
const fooBar = await mkFooBar(foo, bar);

return Promise.resolve(fooBar);
};

const main2: Promise<FooBar> => {
const a = "a";

return pipe(
TE.tryCatch(() => getFoo(a), e => e),
TE.chain(foo => TE.tryCatch(() => getBar(foo), e => e)),
TE.chain(bar => TE.tryCatch(() => mkFooBar(??, bar), e => e))
);
};
main1函数是此问题的 async/await样式解决方案。我想要做的是在fp-ts chain -style中模拟类似的内容。 main2是我的尝试。

由于 async/await版本将所有中间结果引入本地范围(即 foobar),因此很容易调用依赖于这两个结果的 mkFooBar

但是在fp-ts版本中,中间结果被困在每个任务的范围内。

我认为使该版本工作的唯一方法是使异步函数本身(即 getFoogetBar)也返回其参数,或者也许 TaskEither包装器返回这些参数,以便可以将它们传递给下一个在链中发挥作用。

这是执行此操作的正确方法吗?还是有一个更简单的版本类似于 async/await版本?

最佳答案

根据您在以下计算中需要访问中间结果的次数,我建议您使用 Do from fp-ts-contrib (Haskell表示法的近似表示),或通过手动map ping携带中间结果。

鉴于:

import * as TE from "fp-ts/lib/TaskEither";

declare function getFoo(a: string): TE.TaskEither<unknown, Foo>;
declare function getBar(foo: Foo): TE.TaskEither<unknown, Bar>;
declare function mkFooBar(foo: Foo, bar: Bar): TE.TaskEither<unknown, FooBar>;
Do的示例:
import { Do } from "fp-ts-contrib/lib/Do";

function main2(): TE.TaskEither<unknown, FooBar> {
return Do(TE.taskEither)
.bind("foo", getFoo("a"))
.bindL("bar", ({ foo }) => getBar(foo))
.bindL("fooBar", ({ foo, bar }) => mkFooBar(foo, bar))
.return(({ fooBar }) => fooBar);
}

手动映射示例:
import { pipe } from "fp-ts/lib/pipeable";

function main3(): TE.TaskEither<unknown, FooBar> {
return pipe(
getFoo("a"),
TE.chain(foo =>
pipe(
getBar(foo),
TE.map(bar => ({ foo, bar }))
)
),
TE.chain(({ foo, bar }) => mkFooBar(foo, bar))
);
}

关于typescript - 将一些异步任务链接到fp-ts中,以保留每个任务的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560310/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com