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

152
17

Я играю с написанием веб-приложения. В этом случае я использую 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.

спросил(а) 2012-01-27T16:39:00+04:00 8 лет, 9 месяцев назад
1
Решение
90

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


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

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

ответил(а) 2012-01-30T18:14:00+04:00 8 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема