a = [1, 23, 4] len :: Num a => [b] -> a len [] = 0 len (x : xs) = 1 + len xs -- data Empty = Empty lst :: [a] -> a lst (x : []) = x lst (x : xs) = lst xs -- lst [] = Empty data List a = Cons a (List a) | Nil deriving ( Show ) data EltOrEmpty a = Real a | Empty instance Show a => Show (EltOrEmpty a) where show (Real a) = show a show Empty = "<>" hd :: List a -> EltOrEmpty a hd (Cons x _) = Real x hd (Cons x Nil) = Real x hd Nil = Empty tl (Cons _ xs) = xs tl (Cons _ Nil) = Nil ln (Cons x xs) = 1 + ln xs ln Nil = 0 (#) a b = Cons a b