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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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