我正在浏览Haskell维基书籍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)
使用Kind Signature,我可以使用Cons构造函数来构造和模式匹配安全和不安全的MarkedLists。虽然我明白发生了什么,但遗憾的是我无法建立任何关于Kind Signature如何允许这种情况的直觉。为什么我需要种类签名? Kind Signature做什么?