如何比较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
相关产品推荐
相关产品推荐

