Могу ли я указать перекрытие / перекрытие в 7.8, как 7.10 в Haskell?

Можно ли указать, какой экземпляр перекрывается, а какой перекрывается с помощью ghc 7.8 OverlappingInstances?

Я пытаюсь внести некоторые обновления / изменения в пакеты servant/servant-server. Все прекрасно скомпилировано и все тесты пройдены, кроме одного doctest, который проходил до того, как я добавил это изменение Enter для Raw. Doctest проваливается только на GHC 7,8, и проходит на GHC 7,10. Я считаю, что это связано с тем, что ghc 7.10 я могу указать, какой экземпляр перекрывается, а какой перекрывается. Как я могу сделать это GHC 7,8? Любые идеи / указатели будут с благодарностью. Вот doctest и ошибка, которую я получаю на GHC 7.8:

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

1 ответ

Решение

Это невозможно с OverlappingInstances в 7.8. Необходимо переписать экземпляры, чтобы не было необходимости в прагме OverlappingInstances.

Другие вопросы по тегам