Я читал Принуждение и роли для чайников, и автор мимоходом упомянул, что GADT — это просто синтаксический сахар.
GADT — это синтаксический сахар поверх
(~)
, поэтому ожидайте, что GADT будут иметь номинальные параметры типа роли.
Далее автор не стал вдаваться в подробности, потому что это не было целью поста в блоге. Однако я заинтригован. Как я могу выполнить дешугаризацию моих GADT?
Например, вот простой гетерогенный список с использованием GADT.
{-# Language GADTs, DataKinds, TypeOperators #-}
data HList a where
Empty :: HList '[]
Cons :: a -> HList b -> HList (a ': b)
Как будет выглядеть обессахаренная версия?