Neither language allows user programs to manipulate the internal pointers directly. While this feature can support very sufficient code, it also destroys the safety of the type system. 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.