2016-05-19 10 views
2

私はservant-0.4.4.7を使用しました。以下は私のモデルのコードは次のとおりです。サーバント-0.4.4.7からサーバント-0.7.1への移行

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を使用する場合、私はエラーを取得するworked.But:

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

私は型の不一致があることを理解し、それを修正する方法、私は理解できない。

ありがとう!

答えて

3

EitherTExceptTs(Control.Monad.Trans.Excepttransformers)に変更すると、このトリックを行う必要があります。 EitherTeitherパッケージからのもので、transformers(名前はExceptT)に折りたたまれていますので、servantといっそう多くのパッケージがあり、ExceptTに移行しました。

+0

非常にありがとうございます!私は[link](http://stackoverflow.com/questions/31279943/using-servant-with-readert-io-a)のようにしてみましたが、何かエラーがありました! – QSpider

関連する問題