Объединить две монады, когда ни у одной из них нет трансформатора?

Я играю с написанием веб-приложения. В данном случае я использую scotty и redis, но эта проблема возникает при любом сочетании web/db. До этого я использовал happstack, поэтому хотелось бы получить пример и там.

Scotty позволяет определять маршруты во вложенной монаде, что упрощает доступ к соединению с базой данных внутри маршрута:

main = do
    db <- connect defaultConnectInfo
    scotty 3000 $ do

    get "/keys" $ do
        keys <- liftIO $ runRedis db $ keys "*"
        html $ T.pack $ show keys

Блок do в get имеет тип: Web.Scotty.ActionM (). Все команды redis имеют тип Database.Redis.Redis a. Ни redis, ни scotty не имеют трансформатора монад.

Какой лучший способ объединить их? Я новичок в haskell, но мне удалось заставить ReaderT работать с веб-монадой в happstack.

В идеале, я мог бы как-то сделать новый стек монад, который поддерживает и keys и html в одном блоке do.

13
задан Luis Casillas 27 January 2012 в 22:19
поделиться