For type abbreviation, ML offers the type declara- tion, which simply gives a new name for an existing type. In particular, when new types are given a repre- sentation in terms of existing types, it shouldn't be possible for programs to inspect or change the fields of the representation. Allocation of instances is performed auto- matically by the constructor function. The client of an ADT is not supposed to know or care about its internal implementation details - only about its exported interface. Thus, it makes sense to separate the textual description of the interface from that of the implementation, e.g., into separate files.
Specifications give the names of types, and the names and types of functions in the package.
Bodies give the definitions of the types and functions mentioned in the specification, and possi- bly additional private definitions. Although the idea of defining explicitly all the oper- ators for a type makes good logical sense, it can get quite inconvenient. As programmers we're used to being able to assign values or pass them as arguments without worrying about their types. We may also expect to be able to compare them, at least for equality, without regard to type. Thus, most languages that support ADT's have built- in support for these basic operations, defined in a uniform way across all types.