Since there seem to be some confusion over what it is good for I'll post some excerpts from a Haskell-session:
http://hpaste.org/13412
Basically you get the best of both worlds, static typing, ie types checked at compile-time but you don't have to write out all the types(you can however if you want to).
add x y = x + y
Prelude> :t add
add :: (Num a) => a -> a -> a
Basically you get the best of both worlds, static typing, ie types checked at compile-time but you don't have to write out all the types(you can however if you want to).