====== Introduction to Haskell ======
Different ways of defining the ''sum'' function in Haskell:
sum1 :: [Int] -> Int -> Int -> Int
sum1 v crt_sum crt_index = if crt_index == (length v)
then crt_sum
else sum1 v (crt_sum + (v !! crt_index)) (crt_index + 1)
sum2 v crt_sum crt_index
| crt_index == (length v) = crt_sum
| otherwise = sum2 v (crt_sum + (v !! crt_index)) (crt_index + 1)
sum3 v crt_sum
| v == [] = crt_sum
| otherwise = sum3 (tail v) (crt_sum + (head v))
sum4 [] crt_sum = crt_sum
sum4 (x:xs) crt_sum = sum4 xs (crt_sum + x)
sum5 :: [Int] -> Int
sum5 v = local v 0
where local [] acc = acc
local (x:xs) acc = local xs (acc + x)
Different ways of writing ''atLeastTwo'':
atLeastTwo1 :: [Int] -> Bool
atLeastTwo1 l
| l == [] = False
| otherwise = atLeastOne (tail l)
where atLeastOne ls
| ls == [] = False
| otherwise = True
atLeastTwo2 [] = False
atLeastTwo2 (x:xs) = atLeastOne xs
where atLeastOne [] = False
atLeastOne _ = True
atLeastTwo3 [] = False
atLeastTwo3 [x] = False
atLeastTwo3 (x:y:xs) = True
atLeastTwo4 (_:_:_) = True
atLeastTwo4 _ = False