Haskell Esqueleto проект для списка записей вместо кортежей

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

Например:

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

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

1 ответ

Решение

На самом деле вы сами создаете кортеж. В самом деле:

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,

Другие вопросы по тегам