square x = x*x

apply_n :: (Eq n, Num n) => (a->a) -> n -> a -> a
apply_n f n x = if n==0 then x else apply_n f (n-1) (f x)

fun n =
  let {
     even n = if n == 0 then True else odd (n-1);
    odd n = if n == 0 then False else even (n-1)
  }  
  in 
     even n   

abs n = if n >= 0 then n else -n

inf = 1:[2]

-- slide 46
safediv n d = if d == 0 then [] else [n `div` d]

-- slide 51
odds n = let f x = x*2+1 in map f [0..n-1]

-- slide 55
safetail lis = undefined

-- slide 60: zip' because there is a zip in Prelude
zip' :: [a] -> [b] -> [(a,b)]
zip' [] _ = []
zip' _ [] = []
zip' (x:xs) (y:ys) = (x,y):zip' xs ys 


-- slides 61-66: there is drop, and, concat, replicate, and elem in Prelude
drop' n lis = undefined

and' lis = undefined

concat' lis = undefined

replicate' e = undefined

elem' e lis = undefined

merge :: Ord a => [a] -> [a] -> [a]
merge l1 l2 = undefined

msort :: Ord a => [a] -> [a]
msort lis = undefined

