【发布时间】:2012-01-27 13:39:14
【问题描述】:
我正在玩写一个网络应用程序。在这种情况下,我使用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 都没有单子转换器。
将这些结合起来的最佳方式是什么?我是haskell 的新手,但我确实设法让ReaderT 与happstack 中的web monad 一起工作。
理想情况下,我可以在同一个 do 块中创建一个支持 keys 和 html 的新 monad 堆栈。
【问题讨论】:
-
人们通常只满足于 haskell web 框架中的 liftIO 吗?
-
我在这里不知道答案,但我认为您的问题类似于 monad 转换器。基本上,你想实现一个类型,我们称之为
IdentityTT m' m a,这样IdentityTT m'的行为就和IdentityT完全一样。当然,要回答的第一个问题是这是否可能。 -
问题的另一种表述方式是:您是否使用 liftIO 来查询所有 haskell 框架中的数据库?当数据库未纳入框架时,最常见的模式是什么?
-
我在这里没有看到 liftIO 的问题?
标签: haskell monads monad-transformers