module S01 (
  -- * Exercise 3
  n,

  -- * Exercise 4
  last, last',

  -- * Exercise 5
  init, init',

  -- * Exercise 6
  gcd
  ) where
import Prelude hiding (last, init, gcd)

{-| The previous version was
 
> N = a 'div' length xs
>    where
>        a = 10
>      xs  = [1,2,3,4,5]

containing the following errors:

  1. @N@ is not allowed as function name (since it is uppercase).

  2. the proper way of turning a function infix is @\`div\`@ instead of @\'div\'@

  3. the second item of the where-group has to be indented exactly
    like the first one
-}
n :: Int
n = a `div` length xs
  where
    a  = 10
    xs = [1,2,3,4,5]

last :: [a] -> a
last xs  = head (reverse xs)
last' xs = head (drop (length xs - 1) xs)

init :: [a] -> [a]
init xs  = reverse (tail (reverse xs))
init' xs = take (length xs - 1) xs

gcd :: Int -> Int -> Int
gcd 0 0 = error "'gcd 0 0' is undefined"
gcd m n = gcd' (abs m) (abs n)
  where
    gcd' x 0 = x
    gcd' x y = gcd' y (x `mod` y)