But suppose we'd like the same program to work on arrays containing both integers and floats. Generally, each array element will need to be tagged with the correct type. To maintain whatever security type-checking of primitive types gives us, we must insist at a minimum that and are structurally equivalent . 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.
Type Names Question becomes more interesting because of type names . E.g., 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. C Type Equivalence C uses structural equivalence for array and function types, but name equivalence for struct , union , and enum types.