如何理解PureScript报错及修复Affjax的TypesDoNotUnify错误
问题根源分析
你的报错属于PureScript最常见的TypesDoNotUnify类错误,核心是类型不匹配:
Could not match type Effect with type Aff
while trying to match type Effect Unit with type Aff t0
while checking that expression (apply log) ((append "Quote failed: ") (printError err)) has type Aff t0
具体问题有三处:
sendQuoteRequest的类型签名错误:launchAff_ :: Aff Unit -> Effect Unit,返回值是Effect Unit类型,你写的Either Error Unit和实际返回值完全不匹配。- 代码中
do块处于Aff异步上下文,你直接调用的log :: String -> Effect Unit是同步Effect类型的函数,无法直接在Aff上下文里执行,类型不匹配。 - 代码中使用了
AX别名调用Affjax方法,但没有补全对应的导入声明。
修复方案
1. 补全/修正导入
import Affjax as AX -- 新增缺失的别名导入 import Effect.Aff.Class (liftEffect) -- 导入Effect转Aff的工具函数
2. 修正sendQuoteRequest的类型签名
sendQuoteRequest :: Effect Unit
3. 把do块里的log调用用liftEffect包裹,转成Aff类型
sendQuoteRequest :: Effect Unit sendQuoteRequest = launchAff_ do result <- AX.request(AX.defaultRequest { url = makeQuoteRequest "0xd6df932a45c0f255f85145f286ea0b292b21c90b" "0xc2132d05d31c914a87c6611c10748aeb04b58e8f" "1000000000000000000" ,method = Left GET ,responseFormat = ResponseFormat.json }) case result of Left err -> liftEffect $ log $ "Quote failed: " <> AX.printError err Right response -> liftEffect $ log $ "GET /api response: " <> stringify response.body
修改后即可正常编译运行。
TypesDoNotUnify错误通用排查步骤
- 第一步:提取报错核心的两个不匹配类型:找到报错中
Could not match type A with type B的内容,A是你当前代码实际返回的类型,B是当前上下文要求的类型,明确是哪两类类型冲突。 - 第二步:定位冲突代码位置:找到报错中
while checking that expression XXX的内容,XXX就是触发类型错误的具体代码段,确认排查范围。 - 第三步:核对当前上下文的类型要求:如果冲突发生在do块内,先确认do块所属的Monad类型(比如本例中是Aff Monad),do块内所有语句的返回类型都必须符合该Monad的要求。
- 第四步:核对函数签名与实际返回值的一致性:如果是顶层函数报错,先检查你写的类型签名和函数实际返回的类型是否匹配,很多时候签名写错会导致连锁类型错误。
- 第五步:检查类型转换逻辑:如果需要在不同Monad之间切换(比如Effect转Aff、Maybe转Either等),确认是否调用了正确的转换函数(比如本例的liftEffect)。
内容的提问来源于stack exchange,提问作者John Hopkins
相关产品推荐
相关产品推荐

