Not to be confused with an algebraic data type.
An abstract data type is a type whose implementation is not visible, but can only accessed through specific operations.
For example, a stack of integers can be represented as any type which is equipped with operations
Type-theoretically, abstract data types are represented through existential types.
In object-oriented programming, abstract data types are represented through interfaces.
In purely functional languages, such as [Haskell], abstract data types are sometimes represented through [type classes]. This does not provide the hiding mechanisms that existential types and interfaces provide, but it does allow for constraining types in a signature to ones that support a certain interface.
However, please note that Haskell does have some limited support for existential types.
Mitchell, John C., and Gordon D. Plotkin. ‘Abstract Types Have Existential Types’. In Proceedings of the 12th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages - POPL ’85, 37–51. Association for Computing Machinery, 1985. https://doi.org/10.1145/318593.318606.
@inproceedings{mitchell_1985,
title = {Abstract types have existential types},
doi = {10.1145/318593.318606},
pages = {37--51},
booktitle = {Proceedings of the 12th {ACM} {SIGACT}-{SIGPLAN} symposium on Principles of Programming Languages - {POPL} '85},
publisher = {Association for Computing Machinery},
author = {Mitchell, John C. and Plotkin, Gordon D.},
date = {1985},
}
Mitchell, John C., and Gordon D. Plotkin. ‘Abstract Types Have Existential Type’. ACM Transactions on Programming Languages and Systems 10, no. 3 (July 1988): 470–502. https://doi.org/10.1145/44501.45065. [pdf]
@article{mitchell_1988,
title = {Abstract types have existential type},
volume = {10},
doi = {10.1145/44501.45065},
pages = {470--502},
number = {3},
journaltitle = {{ACM} Transactions on Programming Languages and Systems},
author = {Mitchell, John C. and Plotkin, Gordon D.},
date = {1988},
}