Haskell Esqueleto проект для списка записей вместо кортежей - PullRequest
0 голосов
/ 02 мая 2018

Во всех примерах, которые я видел, результаты из esqueleto проецируются в список кортежей. Это усложняет кодирование и обслуживание из-за отсутствия меток.

Например:

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

Есть ли способ заставить esqueleto проецировать результаты в список записей?

1 Ответ

0 голосов
/ 03 мая 2018

На самом деле вы сами создаете кортеж. Действительно:

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

Таким образом, вы используете (^.) :: (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 <b>li</b>

Вы получите список [Entity Foo], где Foo - тип запрашиваемого вами объекта.

Вы можете использовать entityVal :: Entity a -> a, чтобы получить объект, заключенный в Entity, например:

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

учитывая, что сущность, конечно, является экземпляром Show.

...