I was reading the explanation of GADTs on the wiki , and but can't make any sense of the examples.
data NotSafe
data Safe
data MarkedList :: * -> * -> * where
Nil :: MarkedList t NotSafe
Cons :: t -> MarkedList t y -> MarkedList t z
safeHead :: MarkedList x Safe -> x
safeHead (Cons x _) = x
silly 0 = Nil
silly 1 = Cons () Nil
silly n = Cons () $ silly (n-1)