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

如何理解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

具体问题有三处:

  1. sendQuoteRequest的类型签名错误:launchAff_ :: Aff Unit -> Effect Unit,返回值是Effect Unit类型,你写的Either Error Unit和实际返回值完全不匹配。
  2. 代码中do块处于Aff异步上下文,你直接调用的log :: String -> Effect Unit是同步Effect类型的函数,无法直接在Aff上下文里执行,类型不匹配。
  3. 代码中使用了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:54:04