2

どのインスタンスがオーバーラップしているか、どのインスタンスが ghc 7.8 OverlappingInstances とオーバーラップ可能かを指定することは可能ですか?

servant/servant-server パッケージにいくつかの更新/変更を加えようとしています。この変更を追加する前にパスしていた 1 つの doctest を除いて、すべてが正常にコンパイルされ、すべてのテストがパスします。doctest は ghc 7.8 でのみ失敗し、ghc 7.10 でパスします。これは、ghc 7.10 でどのインスタンスが重複しているか、どのインスタンスが重複可能かを指定できるという事実に関連していると思います。これをghc 7.8で達成するにはどうすればよいですか? どんなアイデア/ポインタも大歓迎です。以下は、ghc 7.8 で発生した doctest と失敗のエラーです。

-- >>> import Control.Monad.Reader
-- >>> import qualified Control.Category as C
-- >>> type ReaderAPI = "ep1" :> Get '[JSON] Int :<|> "ep2" :> Get '[JSON] String
-- >>> let readerServer = return 1797 :<|> ask :: ServerT ReaderAPI (Reader String)
-- >>> let mainServer = enter (generalizeNat C.. (runReaderTNat "hi")) readerServer :: Server ReaderAPI
--

-- $setup
-- >>> import Servant.API
-- >>> import Servant.Server

-- Error
### Failure in src/Servant/Server.hs:129: expression `let mainServer = enter (generalizeNat C.. (runReaderTNat "hi")) readerServer :: Server ReaderAPI'
expected:
but got:
          <interactive>:44:18:
              Couldn't match type ‘Control.Monad.Trans.Either.EitherT
                                     ServantErr IO [Char]’
                            with ‘ReaderT String Data.Functor.Identity.Identity [Char]’
              In the expression:
                  enter (generalizeNat C.. (runReaderTNat "hi")) readerServer ::
                    Server ReaderAPI
              In an equation for ‘mainServer’:
                  mainServer
                    = enter (generalizeNat C.. (runReaderTNat "hi")) readerServer ::
                        Server ReaderAPI
4

1 に答える 1

0

これは、7.8 の OverlappingInstances では不可能です。OverlappingInstances プラグマが不要になるようにインスタンスを書き直す必要があります。

于 2015-08-26T14:03:39.443 に答える