haskell - ¿Cómo hacer que ReaderT funcione con otro transformador de mónada?
monads monad-transformers (1)
Tienes que cambiar los argumentos que has proporcionado como id
para que sean los que tienen el tipo de todo forall a. ma -> na
forall a. ma -> na
y m Response -> IO Response
respectivamente. ¿Por qué? No lo sé, pero el ejemplo que encontré aquí muestra a alguien ejecutándolo de forma similar a
main = do
let config = Config "Hello, world"
runner = flip runReaderT config
scottyT 3000 runner runner routes
Lo probé, y al menos funciona. No sé si estas son las mejores prácticas o no. Si alguien tiene un método mejor, no dude en publicarlo.
Me gustaría incrustar ReaderT
en otro transformador de mónada. ¿Cómo hago esto? El siguiente ejemplo usa Scotty
pero creo que sería lo mismo con cualquier otra mónada.
{-# LANGUAGE OverloadedStrings #-}
import qualified Web.Scotty
import Web.Scotty.Trans
import Data.Text.Lazy
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Reader
import Control.Monad.Trans
data Config = Config Text
main :: IO ()
main = do
let config = Config "Hello World"
-- how to I make this line work?
scottyT 3000 id id routes
routes :: ScottyT Text (ReaderT Config IO) ()
routes = do
get "/" info
info :: ActionT Text (ReaderT Config IO) ()
info = do
-- this part seems like it works!
Config message <- lift ask
text $ "Info: " `append` message
Este error en la línea scottyT 3000 id id routes
, porque scottyT
espera un ScottyT Text IO ()
. ¿Cómo hago que esto funcione? Aquí están los errores actuales:
Server.hs: line 24, column 24:
Couldn''t match type `ReaderT Config IO'' with `IO''
Expected type: ScottyT Text IO ()
Actual type: ScottyT Text (ReaderT Config IO) ()