没有变压器时合并两个单子?

Sea*_*ess 13 monads haskell monad-transformers

我正在玩写一个网络应用程序.在这种情况下,我使用的是scottyredis,但是这个问题出现在任何web/db组合中.在此之前我使用过happstack,所以我也喜欢那里的一个例子.

Scotty让您在嵌套的monad中定义路由,这样可以轻松访问路径中的数据库连接:

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

    get "/keys" $ do
        keys <- liftIO $ runRedis db $ keys "*"
        html $ T.pack $ show keys
Run Code Online (Sandbox Code Playgroud)

get中的do块有类型:Web.Scotty.ActionM ().所有redis命令都有类型Database.Redis.Redis a.redis或scotty都没有monad变压器.

结合这些的最佳方法是什么?我是haskell的新手,但我确实设法让ReaderT在网上monad中工作.

理想情况下,我可以以某种方式创建一个新的monad堆栈,支持两个keyshtml在同一个块中.

Sea*_*ess 4

出于某种原因,我觉得 liftIO 很丑,但它确实不错。特别是如果你这样做:

queryRedis :: Connection -> Redis a -> ActionM a
queryRedis db r = liftIO $ runRedis db r
Run Code Online (Sandbox Code Playgroud)

并定义一个部分应用的函数redis = queryRedis db。感谢大家