-- | Purely functional data structures,
-- First example: reversing a list
-- Functional Programming course 2018.
-- Thomas Hallgren
{-
This started as a skeleton, the definitions were filled in
during the lecture.
-}
--------------------------------------------------------------------------------
import Prelude hiding (sum,reverse)
-- | Computing the sum of a list of numbers
sum :: [Int] -> Int
sum [] = 0
sum (x:xs) = x+sum xs
-- | Reversing a list
reverse_v1 :: [a] -> [a]
reverse_v1 [] = []
reverse_v1 (x:xs) = reverse_v1 xs ++ [x]
-- A more efficient way to reverse a list...
reverse :: [a] -> [a]
reverse xs = revOnto xs []
-- revOnto xs ys = reverse xs ++ ys
revOnto [] ys = ys
revOnto (x:xs) ys = revOnto xs (x:ys)