DatatypeContexts устарел в последних версиях GHC: почему? - PullRequest
63 голосов
/ 16 сентября 2011

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

The Glorious Glasgow Haskell Compilation System, version 7.2.1

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

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

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

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

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

Ответы [ 2 ]

93 голосов
/ 16 сентября 2011

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

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

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

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

9 голосов
/ 16 сентября 2011

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

...