You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

fp-ts如何将ReaderTaskEither数组的单层结构扁平化处理?

解决方案

实现思路

你当前持有的ContextResult<OwnedApp[]>[]是多个ReaderTaskEither实例的集合,每个实例内部包含一个OwnedApp数组,原生的flat/flatMap是JS数组的方法,只能操作外层的RTE实例数组,无法触达RTE内部包裹的数组内容,所以需要用fp-ts提供的函数式工具组合操作:

  1. 先把多个RTE实例组合成单个RTE实例,收集所有内部的数组结果,得到二维数组OwnedApp[][]
  2. 再把二维数组拍平为一维数组

完整代码实现

首先导入依赖:

import { pipe } from 'fp-ts/es6/function';
import * as RTE from 'fp-ts/es6/ReaderTaskEither';
import * as A from 'fp-ts/es6/Array';

基于你已有的getApps数组转换:

const flattenedGetApps: ContextResult<OwnedApp[]> = pipe(
  getApps,
  // 串行执行所有RTE,收集结果得到 ContextResult<OwnedApp[][]>
  RTE.sequenceArray,
  // 拍平内部二维数组
  RTE.map(A.flatten)
);

如果需要并行执行所有请求提升性能,可以直接在遍历marketplaceIds的阶段一步完成,不用先生成中间的getApps数组:

const getApps: ContextResult<OwnedApp[]> = pipe(
  marketplaceIds,
  // 并行遍历调用接口,直接得到 ContextResult<OwnedApp[][]>
  RTE.traverseArrayPar(marketplaceId => getAppsFromUser(userId, marketplaceId)),
  RTE.map(A.flatten)
);

内容的提问来源于stack exchange,提问作者Sophia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:45:03