gpt4 book ai didi

haskell - 用于 per-handler Reader 的 Scotty monad 转换器

转载 作者:行者123 更新时间:2023-12-04 19:04:38 31 4
gpt4 key购买 nike

在问题 Web, Scotty: connection pool as monad reader展示了如何使用 ScottyT嵌入 Reader monad 在堆栈中访问静态配置(在这种情况下,连接池)。

我有一个类似的问题,但更简单——或者至少我是这么认为的……

我想添加一个 Reader到单个处理程序(即 ActionT ),而不是整个应用程序。

我从上面的问题开始修改程序,但我不知道如何打开 ActionT Text (ReaderT String IO)ActionT Text IO处理程序需要。在摸索并尝试使用打字孔希望看到如何构建它之后,我现在必须放弃并寻求帮助。我真的觉得这应该很简单,但无法弄清楚如何做到这一点。

这是程序,突出显示了我卡住的行:

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Text.Lazy as T
import Data.Text.Lazy (Text)
import Control.Monad.Reader
import Web.Scotty.Trans

type ActionD = ActionT Text (ReaderT String IO)

main :: IO ()
main = do
scottyT 3000 id id app

-- Application
app :: ScottyT Text IO ()
app = do
get "/foo" $ do
h <- handler -- ?
runReaderT h "foo" -- ?
--get "/bar" $ do
-- h <- handler
-- runReaderT h "bar"

-- Route action handler
handler :: ActionD ()
handler = do
config <- lift ask
html $ T.pack $ show config

最佳答案

如果您想在单独的阅读器中运行每个操作,则不需要更复杂的 Scotty.Trans界面。您可以使用 ReaderT 以相反的方式构建您的 monad 堆栈。在上面。

import qualified Data.Text.Lazy as T
import Control.Monad.Reader
import Web.Scotty

type ActionD = ReaderT String ActionM

main :: IO ()
main = do
scotty 3000 app

-- Application
app :: ScottyM ()
app = do
get "/foo" $ do
runReaderT handler "foo"

-- Route action handler
handler :: ActionD ()
handler = do
config <- ask
lift $ html $ T.pack $ show config

关于haskell - 用于 per-handler Reader 的 Scotty monad 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28361505/

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