Я просматриваю книги Haskell wiki GADTS
https://en.wikibooks.org/wiki/Haskell/GADT.
Я хорошо отслеживал, пока не была добавлена подпись Kind, которая обобщает ограниченный тип конструктора Cons.
data Safe
data NotSafe
data MarkedList :: * -> * -> * where
Nil :: MarkedList t NotSafe
Cons :: a -> MarkedList a b -> MarkedList a c
safeHead :: MarkedList a Safe -> a
safeHead (Cons x _) = x
silly 0 = Nil
silly 1 = Cons () Nil
silly n = Cons () $ silly (n-1)
С помощью Подписи типа я могу использовать конструктор Cons для построения и сопоставления шаблонов как с безопасными, так и с небезопасными MarkedLists. Хотя я понимаю, что происходит, я, к сожалению, испытываю трудности с созданием какой-либо интуиции относительно того, как это допускает Kind Signature. Зачем нужна Подпись? Что такое подпись?