Haskell Esqueleto投射到记录列表而不是元组

时间:2018-05-02 20:58:25

标签: haskell tuples record esqueleto

在所有示例中,我看到esqueleto的结果被投射到元组列表中。由于缺少标签,这使得编码和维护更加困难。

例如:

previousLogItems <- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return (li ^. LogItemId, li ^. LogItemTitle)

有没有办法让esqueleto将结果投影到记录列表?

1 个答案:

答案 0 :(得分:4)

事实上,你自己构建了元组。事实上:

previousLogItems <- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return (li ^. LogItemId, li ^. LogItemTitle)

因此,您可以使用(^.) :: (PersistEntity val, PersistField typ) => expr (Entity val) -> EntityField val typ -> expr (Value typ)“选择器”来获取字段并将它们包装成元组。

如果你这样写:

previousLogItems >- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return li

您将获得[Entity Foo]的列表,其中Foo是您查询的对象类型。

您可以使用entityVal :: Entity a -> a获取包含在Entity中的实体,例如:

previousLogItems <- select $ from $ \li -> do
        orderBy [desc (li ^. LogItemId)]
        limit 10
        return li
mapM_ (print . entityVal) previousLogItems

鉴于实体当然是Show的实例。