Typescript:如何使用fp ts组合kleisli(单子组合)Promise monad

Typescript:如何使用fp ts组合kleisli(单子组合)Promise monad,typescript,functional-programming,fp-ts,Typescript,Functional Programming,Fp Ts,如何使用fp-ts将两个kleisli箭头(函数)f:A->Promise B和g:B->Promise C组合成h:A->Promise C 我对Haskell很熟悉,所以我会这样问:=>(fish操作符)的等价物是什么?承诺由fp ts中的或单子表示,它们是异步计算Task或者另外对故障建模,与Task相同 Kleisli箭头可以通过单子和(管道操作器)的操作组成。其结果类似于Haskell算子的应用 让我们用任务或做一个示例: const f = (a: A): Promise<B&

如何使用fp-ts将两个kleisli箭头(函数)
f:A->Promise B
g:B->Promise C
组合成
h:A->Promise C


我对Haskell很熟悉,所以我会这样问:
=>
(fish操作符)的等价物是什么?

承诺由
fp ts
中的或单子表示,它们是异步计算
Task或者
另外对故障建模,与
Task
相同

Kleisli箭头可以通过单子和(管道操作器)的操作组成。其结果类似于Haskell算子的应用

让我们用
任务或
做一个示例:
const f = (a: A): Promise<B> => Promise.resolve(42);
const g = (b: B): Promise<C> => Promise.resolve(true);
组成两部分:
const piped = flow(fK, TE.chain(gK)); // (a: A) => TE.TaskEither<unknown, C>
const piped=flow(fK,TE.chain(gK));//(a:a)=>TE
下面是一个复制粘贴块,用于:

//您还可以编写:
//从“fp-ts”导入{task或作为TE};
从“fp ts/lib/taskother”导入*作为TE;
//你也可以写:
//从“fp ts”导入{pipeable as P};P.管道(…)
从“fp ts/lib/function”导入{flow,identity,pipe};
从“fp ts/lib/Task”导入*作为T;
类型A=“A”;
类型B=“B”;
类型C=“C”;
常量f=(a:a):Promise=>Promise.resolve(“B”);
常量g=(b:b):Promise=>Promise.resolve(“C”);
//'identity'的替代选项:在fp ts/lib/earth中使用'toError'
常数fK=TE.tryCatchK(f,标识);
常数gK=TE.tryCatchK(g,恒等式);
管道常数=流量(fK,TE.链(gK));
常数效应=管道(
“A”,
管道,
折叠(
(错误)=>
T.fromIO(()=>{
控制台日志(err);
}),
(c) =>
T.fromIO(()=>{
控制台日志(c);
})
)
);

效应()是你要找的吗?如果是这样,我可以写一个答案;如果没有,请详细说明您想要什么。@jcalz
monad.chain(f(a),g)这部分就是我要找的。非常感谢。我还认为我可以使用Task而不是实现一个完整的Monad来表示承诺전인건 我认为FP-TS在无点样式()的上下文中很难推断类型,因此您必须临时手动编写箭头。此外,如果您想要一个具有并行操作语义的单独类型,您可能只需要实现自己的异步类型更多阅读请注意,长
任务
序列会构建巨大的延迟函数调用树,在触发求值时可能会破坏堆栈。
const piped = flow(fK, TE.chain(gK)); // (a: A) => TE.TaskEither<unknown, C>