Programmers are used to assigning values or passing them as arguments without worrying about their types. 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. Unfortunately, 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 . Signatures can be attached to structures, but can also be separately named and manipulated, without reference to any particular structure. The same structure can be viewed through multiple signatures.