Type inference is a feature predominant in functional programming languages such as Haskell and ML.
Type inference automatically assigns a type signature onto a function if it is not given. In a sense, the type signature is reconstructed from the compiler/interpreter's understanding of the function's subfunctions with well defined type signatures, and thus the input/output type can be ascertained.
For example, let us consider the Haskell function
length, and it is defined as:
length  = 0 length (first:rest) = 1 + length restFrom this, it is evident that the function handles lists as inputs, and the base case of this recursive function returns an integer (Haskell "Int"). So we can reliably construct a type signature
length :: [a] -> IntSince there are no ad-hoc polymorphic subfunctions in the function definition, we can declare the function to be parametric polymorphic.