13

我正在玩写一个网络应用程序。在这种情况下,我使用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

get 中的 do 块具有类型:Web.Scotty.ActionM (). 所有 redis 命令都有 type Database.Redis.Redis a。redis 或 scotty 都没有单子转换器。

将这些结合起来的最佳方法是什么?我是haskell 的新手,但我确实设法让ReaderT 与happstack 中的web monad 一起工作。

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

4

1 回答 1

4

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

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

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

于 2012-01-30T15:14:02.603 回答