# Principal type

In type theory, a type system is said to have the **principal type** property if, given a term and an environment, there exists a **principal type** for this term in this environment, i.e. a type such that all other types for this term in this environment are an instance of the principal type.

The principal type property is a desirable one for a type system, as it provides a way to type expressions in a given environment with a type which encompasses all of the expressions' possible types, instead of having several incomparable possible types. Type inference for systems with the principal type property will usually attempt to infer the principal type.

For instance, the ML system has the principal type property and principal types for an expression can be computed by Robinson's unification algorithm, which is used by the Hindley–Milner type inference algorithm. However, many extensions to the type system of ML, such as polymorphic recursion, can make the inference of the principal type undecidable. Other extensions, such as Haskell's generalized algebraic data types, destroy the principal type property of the language, requiring the use of type annotations or the compiler to "guess" the intended type from among several options.

The principal type property should not be confused with the **principal typing** property which requires that, given a term, there exist a typing (i.e. a pair with a context and a type) which is an instance of all possible typings of the term.^{[1]}