DatatypeContexts устарел в последнем GHC: почему?


Я просто делал некоторые разработки Haskell, и я перекомпилировал какой-то старый код на новой версии GHC:

The Glorious Glasgow Haskell Compilation System, version 7.2.1

и когда я сделал, я получил следующую ошибку:

предупреждение: - xdatatypecontexts устарел: он широко считался неправильным и был удален из языка Haskell.

, который появляется, когда у вас есть код в следующем формате:

data Ord a => MyType a
    = ConstructorOne a
    = ConstructorTwo a a

мой вопрос: почему была эта функция устаревший в первую очередь, и что я должен делать вместо этого, чтобы достичь той же или подобной функциональности?

3 61

3 ответа:

это устарело, потому что это был поиск, и на самом деле не есть любой полезный функционал! Все, что он делал, это заставлял кучу дополнительных ограничений в других местах. В частности, при сопоставлении шаблонов на таком типе вы были бы вынуждены добавить ограничение, а не (как можно было бы изначально надеяться) получить доступ к контексту, основываясь на знании, которое должно было быть доступно для создания значения в первую очередь.

в "замена", которая на самом деле работает по-другому и отслеживает известные контексты для вас, заключается в вместо этого используйте объявления в стиле GADT:

data MyType a where
    ConstructorOne :: Ord a => a -> MyType a
    ConstructorTwo :: Ord a => a -> a -> MyType a

GADTs в целом более гибки и во многих других отношениях, но для этого конкретного случая происходит то, что создания значение нужно Ord ограничение, которое затем переносится вместе со значением, и сопоставление шаблонов в конструкторе вытаскивает его обратно. Так что вам даже не нужен контекст функции, использующие его, потому что вы знаете, что в силу ожидания чего-то типа MyType a вы получаете Ord a ограничение с ним.

В общем, вам все еще нужно добавить Ord a ограничение на любую функцию, которая использует ваш MyType тип, и как таковой не так полезна, как может показаться. Дополнительные сведения о том, почему они были удалены, см. В разделе http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts

Я также получаю эту ошибку. предложение ntc2 работало для меня, за исключением того, что оно должно быть с небольшим 't' в 'TypeContext', т. е. cabal install --ghc-option '-XDatatypeContexts' <package>