Объединить две монады, когда ни у одного нет трансформатора? - PullRequest
13 голосов
/ 27 января 2012

Я играю с написанием веб-приложения. В этом случае я использую scotty и redis , но эта проблема возникает в любой комбинации web / 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. Ни редис, ни Скотти не имеют монадного трансформатора.

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

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

1 Ответ

4 голосов
/ 30 января 2012

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

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

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

...