Per definire astrazioni di alto livello che consentano di concettualizzare le strtutture dati (collezioni, stringhe, documenti, forme geometriche, ecc) senza ridurle a un agglomerato di componenti (come avviene nella programmazione imperativa), sono necessarie tecniche differenti.
L’ideale sarebbe definire le strutture dati come teorie (in senso matematico), in modo da poter ragionare sulle loro proprietà. Una teoria consiste di:
Un aspetto importante delle teorie matematiche è che, in genere, una teoria non descrive mutazioni, cioè non fornisce meccanismi per modificare caratteristiche degli elementi della teoria. Infatti, le mutazioni possono compromettere la validità delle leggi/proprietà della teoria.
Il vantaggio dell’astrazione basata sulle teorie è la possibilità di ragionare in modo formale sui programmi, così come si fa appunto sulle teorie in ambito matematico, evitando in particolare le difficoltà di ragionamento legate alla semantica operazionale dei linguaggi imperativi (che, essendo basata sui cambiamenti di stato, rende difficile la scrittura delle equivalenze che tipicamente verrebbero usate in matematica per esprimere le proprietà di una teoria).
Un paradigma che fornisce gli strumenti per definire le strutture dati come teorie è la programmazione funzionale (FP, Functional Programming), che in particolare:
Il termine programmazione funzionale ha due possibili significati:
Passando a considerare i linguaggi che implementano le due accezioni di questo paradigma, si ottengono due definizioni di linguaggio di programmazione funzionale (FPL, Functional Programming Language):