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 ответа:
это устарело, потому что это был поиск, и на самом деле не есть любой полезный функционал! Все, что он делал, это заставлял кучу дополнительных ограничений в других местах. В частности, при сопоставлении шаблонов на таком типе вы были бы вынуждены добавить ограничение, а не (как можно было бы изначально надеяться) получить доступ к контексту, основываясь на знании, которое должно было быть доступно для создания значения в первую очередь.
в "замена", которая на самом деле работает по-другому и отслеживает известные контексты для вас, заключается в вместо этого используйте объявления в стиле 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