Structural equivalence treats two objects as the same type if after replacing each type with its definition, the same structure is obtained. In other languages, each declaration introduces a new internal name. In still others, each variable declared in a declaration using a type constructor is declared in effect with a different type. When different types are introduced, some mechanism must be provided for defining operations on objects of the new type. The simplest solution would be to require that every operation of the new type be defined explicitly for that type.
Most languages find ways of re-using operator definitions, to simplify programming.
Inheritance is a common scheme in OO languages. This rule applies when a new type is defined as a subtype of an existing one. The new type inherits all operations defined on its parent. In some languages, certain built-in operations are regarded as applicable to many different types. For instance, assignment of a expression of type T to a variable of type T is often allowed, even if T is programmer-defined.