有没有办法将 IOEither 和 TaskEither 表示为一个也包括tryCatch
?
我目前将通过 HTTP 使用 API,因此使用 TaskEither 是有意义的,但预计此代码将“离家更近”迁移,并且在那时将其设为有意义IOEither
。所以我想写一个无标签风格的消费者界面
interface EngineRepository<M extends URIS2> {
calculateNumber: (i:SomeData) => Kind2<M, DomainError, number>
}
const getRepo = <M>(m:M extends URIS2):EngineRepository<M> => ({
calculateNumber: someCalculation(m)()
})
const calculateNumber = <M>(m:M extends URIS2) => flow(/* M.chain, M.map, etc. works great! */)
到目前为止,一切都很好!然而,虽然有一个tryCatch
for Option、Either、TaskEither、IOEither 等,但我可以说它不是任何接口的一部分。所以我正在尝试创建自己的:
interface Tryable<M extends URIS2> extends Monad2<M> {
tryCatch: <E,A>(f:Lazy<A>, onError: (reason:unknown) => E) => Kind2<M, E, A>
}
const calculateNumber = <M>(m:M extends URIS2) =>
flow(/* M.tryCatch works great now! */)
这里的问题IOError
是同步,所以f:Lazy<A>
很好,TaskEither
是异步的,所以它需要f:Lazy<Promise<A>>
改为。
有没有更好的方法来解决这个问题,或者这是不可能的?我是否需要始终使用 TaskEither,然后添加一个将 IOEither 转换为 TaskEither 并放弃无标记决赛的步骤?