我对函数式编程比较陌生,对fp-ts也很陌生,所以我很难理解提供的 util 函数。我目前正在尝试弄清楚如何将TaskEither
s 作为数组中的后备处理。
我有一个函数来获取一些数据id
,它返回Error
或Success
:
declare function getData(id: number): TaskEither<Error, Success>
我想要的是一个函数,它将遍历一些id
s 数组(例如[1, 2, 3, 4]
),为每个数组请求数据。TaskEither
它应该在成功并返回的第一个停止Right<Success>
。如果所有的TaskEither
s 都失败了,它应该将它们的错误收集到一个Left<Error[]>
.
import { map } from 'fp-ts/lib/Array';
const program: TaskEither<Error[], Success>
= pipe(
[1, 2, 3, 4],
map(getData),
/*
* Now I have a TaskEither<Error, Success>[]
* What comes next?
*/
);
我尝试了类似的方法,但有一些明显的问题(如下所述):
import { map, sequence } from 'fp-ts/lib/Array';
import { map as mapTaskEither } from 'fp-ts/lib/TaskEither'
const program: TaskEither<Error, Success>
= pipe(
[1, 2, 3, 4],
map(getData),
sequence(taskEither), // Now this gets to a TaskEither<Error, Success[]>
mapTaskEither(successes => successes[0])
);
这种方法的问题
- 它
getData
在所有 ID 上运行,第一次成功时不会短路 - 如果有任何
getData
s 错误,它就会出错。所以如果有错误,即使成功getData(4)
了总体也会出错program
getData(1)
- 它不会将错误收集到一个数组中
Error[]