Starting point:
fn :: [a] -> Int
fn = (2 *) . length
Let\'s say we only want to constrain the return value, then we could write:
I think you wish for a pretty bad thing. Feature you want slightly increases handiness of type inference, especially for top-level functions. But signatures of top-level declarations represent essential design contracts. They are API, they are documentation, they are beacons for strangers foraying into your code, thus they have to be rock-solid and clear.
Yes, haskell allows type constraints for return types. But this is mostly for temporary results in let-blocks. And yes, you may use
f (x :: Int) = 2*x
syntax with XScopedTypeVariables extension (yet it isn't applicable to point-free functions).