Week 7: Notes

Here are the solutions to the exercises we solved in the Thursday tutorial.

In some cases I've renamed functions (e.g. last → last') to avoid conflicts with predefined functions in Haskell.

-- 1. Last Element

last' [x] = x
last' (_ : xs) = last' xs


-- 2. Second Last

secondLast [x, _] = x
secondLast (_ : xs) = secondLast xs

-- 3. Zip

zip' [] [] = []
zip' (x : xs) (y : ys) = (x, y) : (zip' xs ys)

-- 4. Unzip

unzip' [] = ([], [])
unzip' ((x, y) : ps) =
    let (xs, ys) = unzip' ps
    in (x : xs, y : ys)

-- 5. Flatten

flatten [] = []
flatten (l : ls) = l ++ (flatten ls)

-- 6. Reverse

reverse' l = reverse2 l []

reverse2 [] a = a
reverse2 (x : xs) a = reverse2 xs (x : a)

-- 7. Infinite Ints

intsFrom i = i : (intsFrom (i + 1))

ints = intsFrom 1

-- 8. Cycle List

cycle' l = l ++ (cycle' l)

-- 9. Termination
--
-- (a) will not terminate; (b) and (c) will terminate

-- 10. Primality Test

isPrime n = isPrime' 2 n

-- Given that no integer less than i divides n, return true if n is prime.
isPrime' i n =
    i * i > n ||
    not (n `mod` i == 0) && isPrime' (i + 1) n