----- -- More examples from lecture data Nat = Zero | Succ Nat deriving (Show, Eq) plus Zero n = n plus (Succ k) n = Succ (plus k n) mult Zero n = Zero mult (Succ k) n = plus n (mult n k) num Zero = 0 num (Succ k) = 1 + (num k) nat 0 = Zero nat n | n>0 = Succ (nat (n-1)) -- Nat is a *type*, Zero and Succ are *constructors* data List = Nil | Cons Int List deriving (Show, Eq) hlist Nil = [] hlist (Cons a ls) = a : (hlist ls) flist [] = Nil flist (x:xs) = Cons x (flist xs) data Boolean = Troo | Phalse knot Troo = Phalse knot Phalse = Troo ------- -- some functions on lists hd (x:_) = x tl (_:xs) = xs null' [] = True null' (_:_) = False last' (x:xs) | xs == [] = x | otherwise = last' xs sum' [] = 0 sum' (n:ns) = n + sum' ns -- ^ ^ ^^^ -- v v vvvv prod' [] = 1 prod' (n:ns) = n * prod' ns fold f u [] = u fold f u (x:xs) = x `f` fold f u xs