Это устарело, потому что было ошибочным, и на самом деле не имело какой-либо полезной функциональности! Все, что он сделал, это навязал кучу дополнительных ограничений в других местах. В частности, при сопоставлении с шаблоном для такого типа вы будете вынуждены добавить ограничение, а не (как можно было бы изначально надеяться) получить доступ к контексту, основываясь на знании того, что для построения значения необходимо было иметься. во-первых.
«Замена», которая на самом деле работает по-другому и отслеживает известные вам контексты, заключается в использовании объявлений в стиле GADT вместо :
data MyType a where
ConstructorOne :: Ord a => a -> MyType a
ConstructorTwo :: Ord a => a -> a -> MyType a
GADT в целом более гибки и во многих других отношениях, но в данном конкретном случае происходит то, что создает значение, требует ограничения Ord
, которое затем переносится вместе со значением и сопоставление с образцом на конструкторе вытаскивает его обратно. Таким образом, вам даже не нужен контекст для функций, использующих его, потому что вы знаете, что благодаря ожиданию чего-то типа MyType a
вы получите ограничение Ord a
.