It contrasts with nominative systems, where comparisons are based on the names of the types or explicit declarations, and duck typing, in which only the part of the structure accessed at runtime is checked for compatibility.
The subtype may contain added features, such as members not present in the base type, or stronger invariants.
A distinction exists between structural substitution for inferred and non-inferred polymorphism.
Some languages, such as Haskell, do not substitute structurally in the case where an expected type is declared (i.e., not inferred), e.g., only substitute for functions that are signature-based polymorphic via type inference.
In 1990, Cook, et al., proved that inheritance is not subtyping in structurally-typed OO languages.
Here the OCaml interactive runtime prints out the inferred type of the object for convenience.
One can define a function that invokes a method: The inferred type for the first argument (< set_x : int -> 'a; .. >) is interesting.