2

我使用了servant-0.4.4.7. 以下是我的模型代码:

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

这段代码有效。但是当我使用时servant-0.7.1,我得到了错误:

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

我知道存在类型不匹配,但如何解决它,我无法理解。

谢谢!

4

1 回答 1

3

将所有EitherTs 更改为ExceptTs (从Control.Monad.Trans.Exceptin transformers)应该可以解决问题。EitherT来自either已被折叠到transformers(名称下ExceptT)的包,因此servant,随着越来越多的包,迁移到ExceptT.

于 2016-05-19T11:45:07.157 回答