2016-05-03 1 views
1

私はfunctionを持っています。これは、それを提供する前にEntityのJsonにデータを追加しています。ハンドラ内のエンティティのリスト上のマップ機能

今私がやっている間、私が得たエンティティのリストに同じ関数を適用したいと思います:

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

テイクインスタンスの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

関連する問題