Cartesian product types are equivalent if their corresponding component types are equivalent. Disjoint union types are equivalent if their corresponding component types are equivalent. Recursive types are a problem. As a way of improving program correctness by subdividing values into types according to their meaning within the program. For this to be useful, some structurally equivalent types must be treated as inequivalent .
Most languages use mixed solutions.
The original Pascal definition is vague. The types of x, y, z are all different, but z and w are the same. Another way to describe the type system is that each application of a type constructor creates a new type. C Type Equivalence C uses structural equivalence for array and function types, but name equivalence for struct , union , and enum types. This makes it possible to uniquely identify the types of literals.