【问题标题】:Scotty monad transformer for per-handler Reader每个处理程序阅读器的 Scotty monad 转换器
【发布时间】:2015-04-06 08:14:43
【问题描述】:

在问题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

【问题讨论】:

  • 有趣。我不知道如何以通用方式执行此操作——这可能需要拆开 ActionT 并重建它。但是,该类型是不透明的,所以我们不能...
  • 哦。唔。可能你是对的。我当然可以将配置显式传递给处理程序,然后再传递给它们调用的函数,但我有一个模糊的想法,即无论何时这样做,都可以使用Reader
  • 问题似乎正在将t1 (t2 m) a 变成t1 m a,其中t1,t2 是monad 转换器。或者,更一般地,将t m1 a 转换为t m2 a,其中m1,m2 是单子。这看起来像是对t 的仿函数要求:给定f :: forall b. m1 b -&gt; m2 b,您希望拥有fmapT f :: t m1 a -&gt; t m2 a。也许不是所有的转换器都允许fmapT,但这可能是一个单独的类型类。或者也许有一些方法可以用我现在没有看到的标准工具来制作它:-/

标签: haskell monad-transformers scotty


【解决方案1】:

如果您想在单独的阅读器中运行每个操作,则根本不需要更复杂的Scotty.Trans 接口。您可以反过来构建您的 monad 堆栈,在顶部使用 ReaderT

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

【讨论】:

  • 对。我想这就是这样做的方法。对于ActionM 操作,我宁愿避免使用lifts,因为Reader 操作会少得多,但也许这是不可避免的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2013-12-19
相关资源
最近更新 更多