# Finding Local Maxima

The following function finds all local maxima.

A local maxima is an element of a list such that it's greater than either of its neighbor elements. An element with 1 neighbor is not a local maximum.

localMaxima :: [Integer] -> [Integer]
localMaxima (x:y:z:zs) = if (y > x && y > z) then y : localMaxima (y:z:zs)
else localMaxima (y:z:zs)
localMaxima _          = []


Examples:

ghci> localMaxima [1,3,2,55,2]
[3,55]
ghci> localMaxima [1,3,2,55,1000000000]
[3]

• Non-recursive oneliner: locmax xs = map (\(x, y, z) -> x) . filter (\(x, y, z) -> x > y && x > z) \$ zip3 (drop 1 xs) xs (drop 2 xs). – Cthulhu Sep 23 '14 at 9:01

You have redundant parentheses here: (y > x && y > z). You can also make your type more generic: localMaxima :: Ord a => [a] -> [a].
I think it looks a bit cleaner using an as-pattern and guard clauses. This way you don't need zs and can just write _.
localMaxima (x:rest@(y:z:_))

In fact, if you know that y > z then you don't need to check if z is a local maximum.