I am using the servant library for my JSON API. I need help to get the ServerT MyAPI (ReaderT a IO) styles stack.
Here is an example using ReaderT , but without integrating it with a servant:
-- this code works type TestAPI = "a" :> Get '[JSON] String :<|> "b" :> Get '[JSON] String test2 :: EitherT ServantErr IO String test2 = return "asdf" testServer :: Int -> Server TestAPI testServer code = test :<|> test2 where test :: EitherT ServantErr IO String test = liftIO $ runReaderT (giveMeAMessage) code -- this is contrived. In my real application I want to use a Reader for the database connection. giveMeAMessage :: ReaderT Int IO String giveMeAMessage = do code <- ask name <- liftIO $ getProgName return $ show code <> name
So, now I would like to make it work with ServerT, following the example of this article .
-- this code doesn't compile testServerT :: ServerT TestAPI (ReaderT Int IO) testServerT = test :<|> test where test :: EitherT ServantErr (ReaderT Int IO) String test = lift $ giveMeAMessage testServer' :: Int -> Server TestAPI testServer' code = enter (Nat $ liftIO . (`runReaderT` code)) testServerT
I get the following error:
server/Serials/Route/Test.hs:43:15: Couldn't match type 'EitherT ServantErr (ReaderT Int IO) String' with 'ReaderT Int IO [Char]' Expected type: ServerT TestAPI (ReaderT Int IO) Actual type: EitherT ServantErr (ReaderT Int IO) String :<|> EitherT ServantErr (ReaderT Int IO) String In the expression: test :<|> test In an equation for 'testServerT': testServerT = test :<|> test where test :: EitherT ServantErr (ReaderT Int IO) String test = lift $ giveMeAMessage Failed, modules loaded: none.
How can I get rid of the error?
Follow-up question: I understand that monad transformers in general, but I'm lost. What topics or links should I study to know enough to answer my own question?
haskell monads monad-transformers
Sean clark hess
source share