我正在玩写一个网络应用程序。在这种情况下,我正在使用scotty和redis,但是这个问题出现在任何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命令都具有类型Database.Redis.Redis a
。 redis或scotty都没有monad变压器。
将这些结合起来的最佳方法是什么?我是haskell的新手,但我确实设法让ReaderT在网上monad中工作。
理想情况下,我可以在同一个do块中以某种方式创建一个支持keys
和html
的新monad堆栈。
答案 0 :(得分:4)
出于某种原因,我觉得liftIO很难看,但它确实不错。特别是如果你这样做:
queryRedis :: Connection -> Redis a -> ActionM a
queryRedis db r = liftIO $ runRedis db r
定义部分应用的函数redis = queryRedis db
。谢谢大家