You need to enable JavaScript to run this app. 在fp-ts中对Either使用getApplicativeValidation后如何通过pipe串联ap调用
优惠活动
大模型
产品
解决方案
定价
更多

在fp-ts中对Either使用getApplicativeValidation后如何通过pipe串联ap调用

问题原因

你调用的V.ap是原生二元方法,签名为:

<V, E, A>(
  fab: E.Either<E, (v: V) => A>,
  fa: E.Either<E, V>
): E.Either<E, A>

需要先传入已提升的柯里化函数、再传入校验结果。而pipe会把上一步的返回值作为当前函数的第一个入参,你直接写V.ap(v1(card.number))仅传入了第二个参数,因此会报参数缺失错误。

解决方法

方法1:最小改动适配pipe

直接用箭头函数包裹V.ap调用,把pipe传入的上一步结果作为V.ap的第一个入参即可,和你原有分步调用逻辑完全等价,保留错误合并能力:

const fromPipe = pipe(
  V.of(createCreditCard),
  (fab) => V.ap(fab, v1(card.number)),
  (fab) => V.ap(fab, v2(card.expiry)),
  (fab) => V.ap(fab, v3(card.cvv))
);
return fromPipe;

方法2:更简洁的sequenceT写法

如果不需要显式链式调用ap,用sequenceT可以更直观实现多校验结果聚合,不需要提前定义柯里化的构造函数:

import { sequenceT } from "fp-ts/lib/Apply";

export const validate = (
  card: CreditCard
): E.Either<ReadonlyArray<string>, CreditCard> => {
  // 原有v1、v2、v3、V的定义保持不变
  return pipe(
    sequenceT(V)(
      v1(card.number),
      v2(card.expiry),
      v3(card.cvv)
    ),
    E.map(([number, expiry, cvv]) => new CreditCard(number, expiry, cvv))
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 14:54:05