An instance of a product type retains the fixed order, but otherwise may contain all possible instances of its primitive data types.
The expression of an instance of a product type will be a tuple, and is called a "tuple type" of expression.
The notion directly extends to the product of an arbitrary finite number of types (an n-ary product type), and in this case, it characterizes the expressions that behave as tuples of expressions of the corresponding types.
Most functional programming languages have a primitive notion of product type.
Additionally, many functional programming languages provide more general algebraic data types, which extend both product and sum types.