我正在阅读GADT 演练,但被困在其中一个练习上。给定的数据结构是:
{-# LANGUAGE GADTs, EmptyDataDecls, KindSignatures #-}
data NotSafe
data Safe
data MarkedList :: * -> * -> * where
Nil :: MarkedList t NotSafe
Cons :: a -> MarkedList a b -> MarkedList a c
练习是实现一个safeTail
功能。我希望它的行为类似于tail
Prelude 中的功能:
safeTail (Cons 'c' (Cons 'a' (Cons 't' Nil))) == Cons 'a' (Cons 't' Nil)
safeTail (Cons 'x' Nil) == Nil
safeTail Nil -- type error (not runtime!)
(我实际上并没有定义==
,但希望我的意思很清楚)
这可以做到吗?我不完全确定它会是什么类型……也许safeTail :: MarkedList a Safe -> MarkedList a NotSafe
吧?