我正在学习一些fp-ts
。要创建我遇到的问题的程式化版本,假设我想创建一个不存在的表,所以我必须查询数据库:一个容易出错的异步操作。如果该表不存在,我想创建它:另一个容易出错的异步操作。进一步假设错误类型都是字符串(尽管我也想知道如何在需要时创建联合错误类型),并且成功创建时返回的值是数字 ID。
简而言之,看看表是否存在,如果不存在,就创建它——在整个过程中都有可能出错。关键是我希望这两个错误都反映在最外面的类型中: a TaskEither<string, Option<number>>
。问题是我不确定如何避免获得TaskEither<string, Option<TaskEither<string, number>>>
. 也就是说,我不知道将错误拉入内部Option
并将其合并为最外层错误的最佳方法。
(也许这涉及序列或可遍历?我仍在学习这些。)
关于一些代码:
import { taskEither as TE, option as O } from "fp-ts";
import { pipe } from "fp-ts/lib/function";
// tableExists: () => TE.TaskEither<string, boolean>
// createTable: () => TE.TaskEither<string, number>
// I want this to represent both possible errors. Currently a type error.
// -------------------------------vvvvvv
const example = (): TE.TaskEither<string, O.Option<number>> => {
return pipe(
tableExists(),
// How to pull the possible `left` up to the outermost type?
// ------------------------------------------vvvvvvvvvvvvv
TE.map((exists) => (exists ? O.none : O.some(createTable()))
);
};