Я очень новичок в функциональном программировании и особенно fp-ts
.
В последнее время я борюсь с тем, чтобы поиграть с массивами и связать их в разные монады и в то же время сохранить некоторые детали, связанные с каждым step.
Допустим, у нас есть программа, которая
- извлекает некоторые данные в виде строки
- , если возможно, анализирует строку в массиве
ITitle
; тип может быть Option<ITitle[]>
- отображает их в массив возможных
ITitle
, выполняющих некоторые асинхронные c обновления; тип может быть TaskEither<IError, ITitle>
- Печатает результат (если имеется), включая сбои, с указанием их c ошибок
// error definition
enum ErrorType {
NotFound = 'NOT_FOUND',
Timeout = 'TIMEOUT',
ParseFailure = 'PARSE_FAILURE',
UpdateFailure = 'UPDATE_FAILURE',
Unknown = 'UNKNOWN',
}
// our types
interface ITitle {
title: string;
meta: unknown;
}
interface IError {
msg: string;
type: ErrorType;
}
// helper functions
declare function findTitles(): TaskEither<IError, string>;
declare function parseTitles(items: string): Option<ITitle[]>; // or Either<IError, ITitle[]> whatever fits best
declare function updateTitle(title: ITitle): TaskEither<IError, ITitle>;
Обновление:
Я обновляю вопрос, уточняя c детали, где проблема:
const program = pipe(
findTitles(),
TE.map(parseTitles), // Now we get TaskEither<IError, Option<ITitle[]>>;
TE.chain(titles =>
// Problem is var titles is still wrapped in Option and this won't work
// What if the titles is Either<IError, ITitle[]>?
// How do we preserve the error if titles is an Either?
array.traverse(taskEither)(titles, title => updateTitle(title))
),
// How to log the result including the errors?
// Or in another word how do we run traverse and fold the Eithers?
)