gpt4 book ai didi

haskell - Hasql的session和IO

转载 作者:行者123 更新时间:2023-12-01 23:50:12 24 4
gpt4 key购买 nike

我写了一个函数

app :: Request -> H.Session H.Postgres IO Response

接受网络请求并构建响应(根据需要查询数据库)。为了实际发送响应,我做了一个包装器

runApp :: H.Postgres -> H.SessionSettings -> Application
runApp pg sess req respond =
respond =<< H.session pg sess (app req)

我将此函数传递给 WarprunSettings 永远循环并处理请求:

runSettings appSettings $ runApp pgSettings sessSettings

然而,这真的很糟糕,因为它会为每个请求创建一个新 session ,这违背了连接池和准备好的语句的目的。

我想在 H.session 中调用 runSettings,而不是相反。但是 runSettings 有一个签名 Settings -> Application -> IO () 并且一旦进入 IO 我就失去了对 session 的访问权限。有没有办法回到 Session b m r 中?

这是对私有(private)电子邮件问题的转发。

最佳答案

是的,在您的示例中,您为每个请求都创建了一个新 session ,这是 Not Acceptable 。

首先,Session is just and alias to the reader monad transformer ,这使您可以直接访问池。所以你总是可以这样做:

session postgresSettings sessionSettings $ do
-- session' :: H.Session b m r -> m r
session' <- flip runReaderT <$> ask
let runApp request respond =
respond =<< session' (app request)
liftIO $ do
-- run warp here

其次,ReaderT 有一个 MonadBaseControl实例,用于类似的模式。

关于haskell - Hasql的session和IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26975746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com