繁体   English   中英

如何在 fp-ts 中映射一个包装的值?

[英]How to map a wrapped value in fp-ts?

我有这段代码,我想知道是否可以将下面的pipe转换为一个pipe

const result: TE.TaskEither<DataTransferError, readonly CoinMetadataDto[]> = pipe(
  this.ensureFundsExist(),
  TE.chain((funds) => {
    return pipe(
      funds.map((fund) => {
        return this.coinGeckoAdapter.getCoinMetadata(fund.coinGeckoId);
      }),
      TE.sequenceArray,
    );
  }),
);

换句话说,我可以一次map TaskEither<E, Data[]>映射到TaskEither<E, OtherData[]>吗?

您可以使用ReadonlyArray fp-ts 模块中的柯里化map ,而不是使用Array.prototype.map ( funds.map )。 将此与flow (从左到右的函数组合)结合起来,您可以摆脱嵌套pipe

import * as RA from 'fp-ts/ReadonlyArray'

const result: TE.TaskEither<DataTransferError, readonly CoinMetadataDto[]> = pipe(
  this.ensureFundsExist(),
  TE.chain(
    flow(
      RA.map(fund => this.coinGeckoAdapter.getCoinMetadata(fund.coinGeckoId)),
      TE.sequenceArray
    )
  )
);

但是,使用traverseArray有更好的方法:

export declare const traverseArray: <A, B, E>(
  f: (a: A) => TaskEither<E, B>
) => (as: readonly A[]) => TaskEither<E, readonly B[]>

TE.traverseArray(f)等价于flow(RA.map(f), TE.sequenceArray)

const result: TE.TaskEither<DataTransferError, readonly CoinMetadataDto[]> = pipe(
  this.ensureFundsExist(),
  TE.chain(
    TE.traverseArray(fund =>
      this.coinGeckoAdapter.getCoinMetadata(fund.coinGeckoId)
    )
  )
);

有关更多信息,请查看Traversable类型类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM