簡體   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