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

在Esqueleto中结合countRows与HAVING子句的简化实现疑问

解决Esqueleto查询中countRows的类型歧义问题

简化写法

你可以不用给countRows加类型注解,通过给比较的数值显式指定类型,让Haskell自动推断countRows的类型:

select $ from $ \i -> do
  groupBy (i ^. IngredientName)
  having (countRows >. val (1 :: Int))
  return (i ^. IngredientName)

另一种方式是用count函数替代countRows,传入表中某个具体字段(比如主键IngredientId),这样类型会更明确,不需要额外注解:

select $ from $ \i -> do
  groupBy (i ^. IngredientName)
  having (count (i ^. IngredientId) >. val 1)
  return (i ^. IngredientName)

类型歧义的原因

countRows的类型签名是Num a => SqlExpr (Value a),这表示它能返回任意数值类型的SqlExpr。当你只写countRows >. val 1时,Haskell没法确定a具体是Int、Integer还是其他数值类型,因此会抛出类型歧义错误。

要么给countRows加注解锁定类型,要么给右侧的val 1指定具体类型,让类型推断系统反向推导countRows的类型,这样就能省去countRows的显式注解了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:15:36