{-
     Uge 4 -- definitioner anvendt i opgaverne
-}
-- NB: Denne fil kan ikke direkte læses ind i Hugs, idet
-- den overskriver en del funktioner på en forkert måde

-- reverse (p. 146)
reverse :: [a] -> [a]
reverse [] = []                                   -- (reverse.1)
reverse (x:xs) = reverse xs ++ [x]                -- (reverse.2)


-- sum (p. 141)
sum :: [Int] -> Int
sum [] = 0                                        -- (sum.1)
sum (x:xs) = x + sum xs                           -- (sum.2)


-- length (p. 144)
length :: [a] -> Int
length [] = 0                                     -- (length.1)
length (x:xs) = 1 + length xs                     -- (length.2)

-- length (xs ++ ys) = length xs + length ys      -- (length.4)


-- elem (p. 122)
elem :: Eq a => a -> [a] -> Bool
elem _ []     = False                             -- (elem.1)
elem x (y:ys) = (x==y) || elem x ys               -- (elem.2)


-- (++) (p. 144)
(++) :: [a] -> [a] -> [a]
[]     ++ zs = zs                                 -- (++.1)
(w:ws) ++ zs = w:(ws++zs)                         -- (++.2)


-- shunt (p. 148)
shunt :: [a] -> [a] -> [a]
shunt []     ys = ys
shunt (x:xs) ys = xs (x:ys)


-- rev (p. 149)
rev :: [a] -> [a]
rev xs = shunt xs []

-- id (p. 88)
id :: a -> a
id x = x

-- iter (p. 172)
iter :: Int -> (a -> a) -> (a -> a)
iter n f
  | n > 0       = f . iter (n-1) f
  | otherwise   = id


-- map (p. 156)
map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

