[英]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.