The distinction between operational and denotational aspects of built-in data types discussed in Chapter 4 also applies to data types implemented by the programmer, of course. The operational aspects of an abstract data type are hidden in their internal implementation, whereas its denotational aspects are part of its specification, which assigns mathematical meaning to the operations available in the external interface.