正如标题所述,我想将Either<A, B>[]转换为Either<A[], B[]>
规则是,如果有一个左-值(一个错误),我想得到一个左-值与所有的错误;否则,我想要正确的答案。
这似乎是最简单的事情,但我只有以下几点:
const compress = <A, B>(arr: E.Either<A, B>[]): E.Either<A[], B[]> =>
A.reduce(
E.right([]),
(acc: E.Either<A[], B[]>, v: E.Either<A, B>) =>
E.match(
(a: A) => E.match((aar: A[]) => E.left([...aar, a]),
(bar: B[]) => E.left([a]))(acc),
(b: B) => E.match((aar: A[]) => E.left(aar),
(bar: B[]) => E.right([...bar, b]))(acc)
)(v)
)(arr);似乎太复杂了。
发布于 2022-08-23 22:32:58
有一个separate函数,您可以使用它来收集Either数组中的权限和权限。这可以按原样使用,但您可以通过这样做得到所要的确切类型:
import { separate } from 'fp-ts/Array';
import * as E from 'fp-ts/Either';
import { pipe } from 'fp-ts/lib/function';
declare const es: Array<E.Either<number, string>>;
const output: E.Either<string[], number[]> = pipe(
es,
separate,
// Assuming you want to have the either be left if any result was left.
(s) => s.left.length > 0 ? E.left(s.left) : E.right(s.right),
);在聚合来自多个来源的错误时,sequenceArray也可能是一种捷径,但是一旦遇到一个左转,它就会变成一个左,这样就不会得到所有的左值(如果您需要同时知道所有的左值,这可能是一个潜在的缺点)。
const output2: E.Either<string, readonly number[]> = pipe(
es,
E.sequenceArray,
);https://stackoverflow.com/questions/73462552
复制相似问题