So you wrote
sumexample :: [(Double, Double)] -> [Double]
sumexample [(a, b)] = [ a + b ]
-- ^^^ ^^^ -- (error, corrected)
Ah, great! You've already got all you need to solve it. Almost. The missing part is the appending operator ++, with which a list of any length can be built by appending the singleton lists of its elements:
[ 1, 2, 3, ... ] ===
[1] ++ [2] ++ [3] ++ ...
So then sumexampleList should follow the law of
sumexampleList :: [(Double, Double)] -> [Double]
sumexampleList [a , b , c , ... ] ===
sumexampleList ( [a] ++ [b] ++ [c] ++ ... ) ===
sumexample [a] ++ sumexample [b] ++ sumexample [c] ++ ... ===
sumexample [a] ++ sumexampleList [b, c, ... ]
-- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --- right?
Haskell doesn't understand the above as a valid definitional syntax though. But it does understand
[1, 2, 3, ...] ===
1 : [2, 3, ...]
and so we can re-write the above law in the conventional syntax as
sumexampleList (a : bcde) =
sumexample a ++ sumexampleList bcde
and that is a bona fide recursive function definition in Haskell.
One case is missing though, the one with the empty list, [].
You will need to complete the definition by adding that additional equation.
Having solved this, sumexample :: [(Double, Double)] -> [Double] is bad design: it only works with singletons, but the type is list. So do away with the brackets altogether:
sumexample :: (Double, Double) -> Double
sumexample (a, b) = ....
and amend the recursive definition accordingly.