To review, an ADT is a type together with some operators on that type, such that the operators have an external behavior specification the type has a private internal representation the operators have private internal implementations Clients of the ADT see only the external specification, none of the internal details. This makes it possible for the implementer of the ADT to change the internals without affecting the clients. In effect, the implementer and client agree to an interface contract specifying how values of the type may be used. Ideally, this contract should be completely expressible in our programming language so that the compiler can enforce it.
Client can access and hence depend on internal representation of sets.
And the client can stil invent bogus sets by applying SET to arbitrary lists. Yet the top-level display still knows that the underlying representation uses lists. And the built-in equality operator is able to compare sets, which is inappropriate if they are really abstract. It turns out that we need a special language mechanism to achieve the precise effect we want. This is the abstype declaration.