当两个 monad 都没有变压器时,组合两个 monad 吗?

发布于 2024-12-29 14:13:37 字数 806 浏览 2 评论 0原文

我正在尝试编写一个网络应用程序。在本例中,我使用 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 命令的类型均为 Database.Redis.Redis a。 redis 和 scotty 都没有 monad 转换器。

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

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

走走停停 2025-01-05 14:13:37

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

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

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

For some reason I felt like liftIO was ugly, but it's really not bad. Especially if you do this:

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

And define a partially applied function redis = queryRedis db. Thanks everyone

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文