在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
相关产品推荐
相关产品推荐

