使用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]),类型不匹配导致实例缺失。
解决步骤
转换列表为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模块。检查依赖版本(可选但建议)
虽然不是直接原因,但Stack的resolver可能拉取的vector版本和hasql-th存在隐性兼容问题。可以在package.yaml中明确指定vector版本(比如匹配当前resolver的稳定版本),避免意外的版本冲突。确认模板输入类型要求
[vectorStatement|]生成的编码器是针对Vector类型设计的,不要用普通列表直接传入。确保所有对应$n :: ...[]的参数都是Vector而非[]。
内容的提问来源于stack exchange,提问作者GTF
相关产品推荐
相关产品推荐

