Types are divisions of different classes of values with each type associated with a set of operations, they ensure programs behave in a pre-determined and precise way, and they may be explicitly given by the programmer or inferred automatically by the type system.