Я пишу сервер Happstack, и у меня есть база данных MongoDB для подключения.Для этого я создал функцию для создания пула соединений
type MongoPool = Pool IOError Pipe
withMongo :: (MongoPool -> IO a) -> IO ()
withMongo f = do
pool <- dbPool
f pool
killAll pool
И затем функцию для запуска Action
с созданным пулом:
runDB :: (MonadIO m) => MongoPool -> Action IO a -> m (Either Failure a)
runDB pool f = liftIO $ do
pipe <- runIOE $ aResource pool
access pipe master dbName f
Очевидно, что для этого требуетсянесите pool
во всех маршрутах в качестве параметра.Я хотел бы заключить его в ReaderT
, чтобы runDB
мог иметь тип, подобный Action IO a -> ServerPart (Either Failure a)
или даже лучше, Action IO a -> ServerPart a
, в котором сбой автоматически приведет к ошибке HTTP 500.
Мне трудно обдумать, как этого можно достичь, и я бы хотел получить несколько советов от людей, у которых больше опыта работы с монадами Haskell и happystack.
Спасибо.