在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
相关产品推荐
相关产品推荐

