2016-05-03 3 views
1

У меня есть function, который добавляет некоторые данные Json Entity перед его обслуживанием.Функция карты в списке объектов в обработчике

Теперь я хотел бы применить ту же функцию в список лиц, я при этом:

getEventsR :: Handler Value 
getEventsR = do 
    events <- runDB $ selectList [] [] :: Handler [Entity Event] 
    return $ object ["data" .= events] 

Как я могу применить функцию с такой подписью events:

addMetaData :: EventId 
      -> Event 
      -> HandlerT App IO (Maybe Value) 
addMetaData eid event = do 

ответ

2

Take преимущество экземпляра Traversable.

getEventsR :: Handler Value 
getEventsR = do 
    events <- runDB $ selectList [] [] :: Handler [Entity Event] 
    maybeValues <- sequenceA [addMetaData eid event | Entity eid event <- events] 
    return ... 

Либо

  • sequenceA :: (Traversable t, Applicative app) => t (app a) -> app (t a)
  • sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)

должны быть использованы здесь. (В этом примере t ~ [] и app ~ HandlerT App IO.)

+0

блин, я пытался использовать 'sequenceA' раньше, но не нашли элегантное решение, как ваша :) Спасибо! – amitaibu