-- ++, concat, reverse from SOE (++) :: [a] -> [a] -> [a] -- Note () around operator [] ++ ys = ys (x:xs) ++ ys = x : (xs ++ ys) concat :: [[a]] -> [a] concat xxs = foldr (++) [] xxs -- First reverse: reverse :: [a] -> [a] reverse [] = [] reverse (x:xs) = reverse xs ++ [x] -- Second reverse: reverse xs = rev [] xs where rev acc [] = acc rev acc (x:xs) = rev (x:acc) xs -- Third reverse: revOp a b = b : a reverse xs = foldl revOp [] xs