-- 定义一个类型级别的自然数,用来表示栈的大小 dataNat = Z | SNat-- Z表示0,S表示后继
-- 定义固定长度的列表类型 dataVec a n where VNil :: Vec a Z-- 空列表,长度为 0 VCons :: a -> Vec a n -> Vec a (S n) -- 非空列表,长度为 n+1
-- 显示固定长度列表 instanceShow a => Show (Vecan) where show VNil = "[]" show (VCons x xs) = "[" ++ showElem x ++ showRest xs ++ "]" where showElem :: Show a => a -> String showElem = show showRest :: Show a => Vec a n -> String showRest VNil = "" showRest (VCons x xs) = ", " ++ showElem x ++ showRest xs
-- 测试用例 someFunc :: IO () someFunc = do let vec1 :: VecInt (S (SZ)) -- 长度为2的列表 vec1 = VCons1 (VCons2VNil) print vec1 let vec2 :: VecInt (S (S (SZ))) -- 长度为3的列表 vec2 = VCons3 (VCons2 (VCons1VNil)) print vec2