5

質問Web, Scotty: connection pool as monad readerScottyTでは、モナドをスタックに埋め込んでReader静的構成 (この場合は接続プール) にアクセスする方法が示されています。

同様の質問がありますが、もっと単純です – または、少なくとも私はそう思いました…</p>

アプリ全体ではなく、Reader単一のハンドラー (つまり a ) に aを追加したい。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
4

1 に答える 1

5

Scotty.Trans各アクションを個別のリーダーで実行する場合は、より複雑なインターフェイスはまったく必要ありません。モナドスタックを逆に、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
于 2015-02-06T14:26:12.323 に答える