【发布时间】:2014-09-18 10:42:53
【问题描述】:
假设我有以下模型:
Person
stackOverflowUser Bool
age Int Maybe
使用 Esqueleto (& Yesod),假设我想获得 Stack Overflow 用户的平均年龄。我想用类型签名做一个函数:
userAge :: Handler (Maybe Int)
到目前为止,我有以下内容:
userAge :: Handler [Value (Maybe Int)]
userAge = runDB $
select $
from $ \person -> do
where_ (person ^. PersonStackOverflowUser ==. val True)
return joinV $ avg_ (person ^. PersonAge)
这让我 [Value (Maybe Int)],但我需要深入了解“Maybe Int”。我试过做
mapM_ unValue userAge
但由于某种原因,这样做会引发类型错误,给我 [Maybe ()] 而不是 [Maybe Int]... 另外,我认为上面代码中的最后一行应该有:
person ?. PersonAge
而不是
person ^. PersonAge
因为 PersonAge 可以为 NULL,但更改它会给我一个类型错误,因为:
avg_ :: (PersistField a, PersistField b) => expr (Value a) -> expr (Value (Maybe b))
(^.) :: (PersistEntity val, PersistField typ) => expr (Entity val) -> EntityField val typ -> expr (Value typ)
(?.) :: (PersistEntity val, PersistField typ) => expr (Maybe (Entity val)) -> EntityField val typ -> expr (Value (Maybe typ))
这可能比我想象的要容易,但我无法在网上任何地方找到在 Esqueleto 中使用聚合函数的示例,而且我对 Haskell 很陌生,所以我很难弄清楚.
我想我可以只使用原始 SQL,但如果可能的话,我想使用 Esqueleto 来做到这一点。
【问题讨论】:
标签: haskell yesod persistent esqueleto