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

使用Hasql.TH时遇Data.Vector.Generic.Base.Vector实例缺失错误求助

问题:Hasql.TH编写查询时出现Vector实例不存在错误

使用Hasql.TH编写数据库查询时遇到了如下错误,用Stack管理依赖,未在package.yaml中固定vector版本,不确定是否是版本问题,或是有其他遗漏的问题?

查询代码:

writeEvents :: [EventRow 'NewRecord] -> Session [EventID]
writeEvents =
  flip statement $
    dimap
      (unzip7 . map eventToRow)
      (toList . fmap (mkEventID . toInteger))
      [vectorStatement|
    insert into events (
      title,
      description,
      url,
      venue_id,
      start_date,
      end_date,
      origination
    ) (
      select 
        cols.title,
        cols.description,
        cols.url,
        venues.id,
        cols.start_date,
        cols.end_date,
        cols.origination
      from unnest (
        $1 :: text[],
        $2 :: text?[],
        $3 :: text?[],
        $4 :: text[],
        $5 :: timestamptz[],
        $6 :: timestamptz[],
        $7 :: text[]
      ) as cols (title, description, url, venue_name, start_date, end_date, origination)
      left join venues on (cols.venue_name = venues.name)
    )
    returning (id :: int4)
  |]

错误信息(翻译后):

1. 找不到 (Data.Vector.Generic.Base.Vector [] (Maybe Text)) 实例
       源于对‘Data.Vector.Generic.foldl'’的调用
   • 在‘hasql-1.6.3:Hasql.Private.Encoders.dimension’的第一个参数中,即
       ‘Data.Vector.Generic.foldl'’
     在‘hasql-1.6.3:Hasql.Private.Encoders.array’的第一个参数中,即
       ‘((hasql-1.6.3:Hasql.Private.Encoders.dimension
            Data.Vector.Generic.foldl')
           (hasql-1.6.3:Hasql.Private.Encoders.element
              (hasql-1.6.3:Hasql.Private.Encoders.nullable
                 hasql-1.6.3:Hasql.Private.Encoders.text)))
     在‘hasql-1.6.3:Hasql.Private.Encoders.nonNullable’的第一个参数中,即
       ‘(hasql-1.6.3:Hasql.Private.Encoders.array
           ((hasql-1.6.3:Hasql.Private.Encoders.dimension
               Data.Vector.Generic.foldl')
              (hasql-1.6.3:Hasql.Private.Encoders.element
                 (hasql-1.6.3:Hasql.Private.Encoders.nullable
                    hasql-1.6.3:Hasql.Private.Encoders.text))))

问题原因与解决办法

核心原因

错误本质是你用普通列表[]作为Vector类型,但vector库的Generic Vector实例并不默认支持列表作为Vector实现。[vectorStatement|]模板期望接收Vector类型的输入,而你的代码中unzip7返回的是普通列表(比如[Maybe Text]),类型不匹配导致实例缺失。

解决步骤

  1. 转换列表为Vector类型
    在dimap的输入转换函数里,把unzip7返回的列表转换成Vector。用Data.Vector.fromList包裹每个列表即可:

    dimap
      (\rows -> let (t1, t2, t3, t4, t5, t6, t7) = unzip7 (map eventToRow rows)
                in (fromList t1, fromList t2, fromList t3, fromList t4, fromList t5, fromList t6, fromList t7))
      (toList . fmap (mkEventID . toInteger))
    

    记得导入Data.Vector模块。

  2. 检查依赖版本(可选但建议)
    虽然不是直接原因,但Stack的resolver可能拉取的vector版本和hasql-th存在隐性兼容问题。可以在package.yaml中明确指定vector版本(比如匹配当前resolver的稳定版本),避免意外的版本冲突。

  3. 确认模板输入类型要求
    [vectorStatement|]生成的编码器是针对Vector类型设计的,不要用普通列表直接传入。确保所有对应$n :: ...[]的参数都是Vector而非[]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:20:23