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

如何比较Data.Text.Internal.Lazy.Text与[Char]?类型不匹配问题求解

解决Esqueleto查询返回的Lazy Text与Text类型不匹配问题

你碰到的这个类型不匹配问题,核心是严格Text和惰性Text的类型差异导致的——Esqueleto查询返回的previousLogItem是[Value Data.Text.Text](严格Text的Value列表),但你用Data.Text.Lazy.pack生成的是惰性Text(Data.Text.Internal.Lazy.Text),塞进Value后变成[Value Data.Text.Internal.Lazy.Text],两边类型自然对不上。

下面给你两种直接解决的思路:

方法一:统一用严格Text

如果你想保留查询返回的严格Text类型,只需要把currentWindowTitle转换成严格Text就行。注意要导入严格版本的Text模块的pack,而不是惰性的:

-- 替换原来的Lazy Text导入,改成严格Text的导入
import Data.Text (pack)

-- 然后直接比较就没问题了
[Value (pack currentWindowTitle)] == previousLogItem

现在两边的类型都是[Value Text],类型匹配就能正常编译了。

方法二:统一用惰性Text

如果你的代码更倾向于使用惰性Text,那可以把查询返回的严格Text转换成惰性版本。需要导入Data.Text.Lazy.fromStrict来做转换:

import Data.Text.Lazy (pack, fromStrict)

-- 修改查询语句,把返回的严格Text转成惰性Text
previousLogItem <- select $ from $ \l -> do 
    orderBy [desc (l ^. LogItemId)]
    limit 1
    return (Value $ fromStrict (l ^. LogItemTitle))

-- 现在previousLogItem是[Value Data.Text.Internal.Lazy.Text],和右边的类型一致
[Value (pack currentWindowTitle)] == previousLogItem

额外提醒

最后建议你检查一下LogItem模型里LogItemTitle字段的定义:如果模型里用的是Text(严格),那Esqueleto默认返回的就是严格Text;如果模型里定义的是LazyText,那查询返回的就是惰性Text。让模型定义和代码里使用的类型保持一致,能从根源减少这类类型不匹配的问题。

内容的提问来源于stack exchange,提问作者Răzvan Flavius Panda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:54:04