They may also expect to be able to compare them , at least for equality, without regard to type. So most languages that support ADT's have built-in support for these basic operations, defined in a uniform way across all types. But these are characteristics of the type's implementation , not its interface. Thus, supporting these operations conflicts with separate compilation, often weakening support for the latter. Clients of a module want to know what module does, not how it does it.
Most languages use type information to give a partial characterization of what a module does.
An interface definition is then a collection of identifiers with their types. In many languages it is possible to write and compile client code based solely on type interfaces. Modules in ML ML modules are called structures . ML module interfaces are called signatures . Signatures can be attached to structures, but can also be separately named and manipulated, without reference to any particular structure.