Q:

For Haskell type signature, like babel :: a -> b -> c, is c the return type?

why doesn't Haskell use some kind of special format to reflect this, or -> c can be understood in another way?

A:

You can look at babel’s type signature in two ways. 

(1) babel takes two inputs of type a and b; it produces an output of type c.
(2) babel takes an input of type a and produces an output of type (b -> c).  

(1) gives you back a value of type c with babel fully applied. (2) gives you back a intermediate function of type (b -> c) with babel partially applied; if you choose to apply the intermediate function to a value of type b, you then get the result as you would get from case (1).
This ability to choose partially or fully apply a function gives you the power to build complex functions by gluing simple (intermediate) functions together. 

why doesn't Haskell use some kind of special format to reflect this…?

By default, all functions in Haskell take one input; a function of two arguments is just a function that returns a function. Currying by default is already clear in the type signature. This is why (->) associates to the right so we don't have to write babel :: a -> (b -> c)

A:

Haskell uses a concept called currying, which means there are only single parameter functions, and multiple parameter functions are just functions returning another functions, with the previous parameter "baked in", until all the parameters are filled in.
so
add :: Int -> Int -> Int
add x y = x + y

is equivalent to
add :: Int -> (Int -> Int)
add = \x -> \y -> x + y

