2015-08-18 4 views
2

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

Я пытаюсь сделать некоторые обновления/изменения в пакетах servant/servant-server. Все компилируется отлично, и все тестовые проходы, за исключением одного допроса, который проходил до того, как я добавил это изменение Enter instance for Raw. Доктрист только терпит неудачу на 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 
+0

Перекрывающаяся/перекрывающаяся вещь 7.10. Я не знаю, что вызывает вашу проблему, но вы можете решить ее, не используя перекрывающиеся экземпляры. – dfeuer

+2

Кроме того, 'MIN_VERSION_base' на самом деле не является разумным способом проверки возможностей GHC. Вместо этого используйте '__GLASGOW_HASKELL__> = 710'. Проверьте версию базовой библиотеки только, чтобы проверить, нужна ли базовая библиотека. – dfeuer

+0

@dfeuer вы имеете в виду не использовать перекрывающиеся экземпляры, переписывая экземпляры, поэтому мне не нужно перекрываться? – codedmart

ответ

0

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