Подтвердить что ты не робот

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

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

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

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.

4b9b3361

Ответ 1

По какой-то причине я чувствовал, что liftIO был уродлив, но это действительно неплохо. Особенно, если вы это сделаете:

queryRedis :: Connection -> Redis a -> ActionM a
queryRedis db r = liftIO $ runRedis db r

И определите частично примененную функцию redis = queryRedis db. Спасибо всем