Search code examples
haskellhaskell-waiservant

Migration from servant-0.4.4.7 to servant-0.7.1


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!


Solution

  • Changing all EitherTs to ExceptTs (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.