首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Either<A,B>[]转换为Either<A[],B[]>

将Either<A,B>[]转换为Either<A[],B[]>
EN

Stack Overflow用户
提问于 2022-08-23 16:57:50
回答 1查看 58关注 0票数 1

正如标题所述,我想将Either<A, B>[]转换为Either<A[], B[]>

规则是,如果有一个左-值(一个错误),我想得到一个左-值与所有的错误;否则,我想要正确的答案。

这似乎是最简单的事情,但我只有以下几点:

代码语言:javascript
复制
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);

似乎太复杂了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-23 22:32:58

有一个separate函数,您可以使用它来收集Either数组中的权限和权限。这可以按原样使用,但您可以通过这样做得到所要的确切类型:

代码语言:javascript
复制
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也可能是一种捷径,但是一旦遇到一个左转,它就会变成一个左,这样就不会得到所有的左值(如果您需要同时知道所有的左值,这可能是一个潜在的缺点)。

代码语言:javascript
复制
const output2: E.Either<string, readonly number[]> = pipe(
  es,
  E.sequenceArray,
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73462552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档