haskell monads monad-transformers

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) ()