I used the servant-0.4.4.7
. Below is my model code:
type API = ServletAPI :<|> Raw
type AppM = ReaderT Config (EitherT ServantErr IO)
runApplication :: IO ()
runApplication = do
configApp <- initializationConfig
case configApp of
ConfigNull -> return ()
otherwise -> run (opt_portServer . cfg_optionsArg $ configApp) $ app configApp
app :: Config -> Application
app configApp = serve api (readerServer configApp)
readerServer :: Config -> Server API
readerServer configApp = enter (readerToEither configApp) server
:<|> serveDirectory (opt_pathFolderStatic . cfg_optionsArg $ configApp)
readerToEither :: Config -> AppM :~> EitherT ServantErr IO
readerToEither configApp = Nat $ \x -> runReaderT x configApp
api :: Proxy API
api = Proxy
This code worked.But when I use servant-0.7.1
, I get the error:
Couldn't match type ‘Control.Monad.Trans.Except.ExceptT
ServantErr IO’
with ‘EitherT ServantErr IO’
arising from a functional dependency between:
constraint ‘Servant.Utils.Enter.Enter
(ReaderT Config (EitherT ServantErr IO) Data.Text.Internal.Text)
(AppM :~> EitherT ServantErr IO)
(Control.Monad.Trans.Except.ExceptT
ServantErr IO Data.Text.Internal.Text)’
I understand that there is a type mismatch, but how to fix it, I can not understand.
Thanks!
Changing all EitherT
s to ExceptT
s (from Control.Monad.Trans.Except
in transformers
) should do the trick. EitherT
came from the either
package, which has been folded into transformers
(under the name ExceptT
), so servant
, along with more and more packages, migrated to ExceptT
.