Besonders bequem kann man abstrakte Datentypen durch eine funktionale oder algebraische Spezifikation definieren. In diesem Sinne besteht ein abstrakter Datentyp aus:
Mit den Operationen lassen sich nun ganz beliebige formal korrekt aufgebaute (wohlgeformte) Terme bilden, und in der so gewonnenen Termalgebra kann man mittels der gegebenen Regeln rechnen. Wir erhalten so eine algebraische Struktur (die uns schon bekannten Strukturen wie Halbgruppen, Gruppen, Ringe, Körper, Vektorräume etc. passen hier auch hinein!) Durch die Regeln zerfällt die Termalgebra in Äquivalenzklassen von Termen, und diese sind die Objekte unseres Datentyps. Manchmal unterscheidet man bei den Operationen auch Konstruktoren, mittels deren wir Objekte aufbauen, und Projektoren, über die wir auf Komponenten oder Attribute von Objekten zugreifen. Allein aus Konstruktoren aufgebaute Terme nennt man Grundterme. Oft enthält jede Äquivalenzklasse genau einen Grundterm, auf den sich die anderen Elemente der Klasse mittels der Regeln reduzieren lassen, und der damit das Objekt repräsentiert.
Wir nennen eine algebraische Struktur oft kurz eine Algebra oder, wenn es uns auf ihre Verwendung innerhalb von Programmen ankommt, eine Rechenstruktur. In diesem Falle werden wir nicht direkt auf der Termalgebra arbeiten (das ist meist recht unbequem), sondern eine äquivalente, womöglich effizientere oder leichter handhabbare Implementierung wählen. Deren Schnittstelle ist durch die Angabe der Sorten und der Funktionalität der Operationen gegeben, während ihr gewünschtes Verhalten durch die Regeln näher spezifiziert wird. Für die Frage, ob die Implementierung korrekt ist, hat man gerade die Einhaltung der Regeln nachzuprüfen.