当两个 monad 都没有变压器时,组合两个 monad 吗?
我正在尝试编写一个网络应用程序。在本例中,我使用 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 与 happstack 中的 web monad 一起工作。
理想情况下,我可以以某种方式创建一个新的 monad 堆栈,在同一个 do 块中同时支持 keys
和 html
。
I'm playing around with writing a web app. In this case, I'm using scotty and redis, but this problem comes up in any web/db combo. I used happstack before this, so I'd love an example there too.
Scotty has you define routes in a nested monad, which makes it easy to access the database connection within a route:
main = do
db <- connect defaultConnectInfo
scotty 3000 $ do
get "/keys" $ do
keys <- liftIO $ runRedis db $ keys "*"
html $ T.pack $ show keys
The do block in get has type: Web.Scotty.ActionM ()
. All the redis commands have type Database.Redis.Redis a
. Neither redis or scotty has a monad transformer.
What's the best way to combine these? I'm new to haskell, but I did manage to get ReaderT working with the web monad in happstack.
Ideally, I could somehow make a new monad stack that supports both keys
and html
in the same do block.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
出于某种原因,我觉得 liftIO 很丑,但它确实不错。特别是如果您这样做:
并定义部分应用函数
redis = queryRedis db
。谢谢大家For some reason I felt like liftIO was ugly, but it's really not bad. Especially if you do this:
And define a partially applied function
redis = queryRedis db
. Thanks everyone