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

在ReaderTaskEither中调用返回TaskEither的函数时类型不匹配求助

问题解决:ReaderTaskEither 调用 TaskEither 函数的类型匹配问题

你的代码问题出在 RTE.fromTaskEither 的类型推断上。fromTaskEither 默认会将 ReaderTaskEither 的环境类型推断为 unknown,但链操作需要环境类型保持为 Env,导致类型不匹配。

修复方案一:显式指定 fromTaskEither 的类型参数

给 RTE.fromTaskEither 传入环境、错误、结果的类型参数,明确告知类型系统当前环境为 Env:

import * as E from "fp-ts/Either";
import * as RTE from "fp-ts/ReaderTaskEither";
import * as TE from "fp-ts/TaskEither";
import { pipe } from "fp-ts/function";

type Env = { arid: string };
const getValues = (id: string): TE.TaskEither<Error, number[]> => TE.fromEither(E.right([]));
class Result {
  constructor(public values: number[]) {}
}

export function sut(): RTE.ReaderTaskEither<Env, Error, Result> {
  return pipe(
    RTE.ask<Env, Error>(),
    RTE.chain((env) =>
      pipe(
        getValues(env.arid),
        TE.map((e) => new Result(e)),
        // 显式指定类型参数,匹配环境类型
        RTE.fromTaskEither<Env, Error, Result>
      )
    )
  );
}

修复方案二:柯里化调用 fromTaskEither(更简洁)

利用 fromTaskEither 的柯里化特性,直接传入转换后的 TaskEither 实例并指定类型:

export function sut(): RTE.ReaderTaskEither<Env, Error, Result> {
  return pipe(
    RTE.ask<Env, Error>(),
    RTE.chain((env) =>
      RTE.fromTaskEither<Env, Error, Result>(
        pipe(getValues(env.arid), TE.map(e => new Result(e)))
      )
    )
  );
}

核心原因

TaskEither 本身不依赖环境上下文,而 ReaderTaskEither 绑定了环境类型。使用 fromTaskEither 转换时,必须明确指定转换后的 ReaderTaskEither 接受的环境类型(这里无需使用环境,只要指定为 Env 即可匹配链上的类型约束)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:02:38