Ответ 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
с ним.