Innanzi tutto, ciò a cui ti riferisci come tabella hash è in realtà una mappa . Questo è il nome generico per questo tipo di struttura dati; una mappa hash implica un'implementazione specifica (una che utilizza una funzione hash). Una firma minima della Mappa Tipo di dati astratti (ADT) è simile alla seguente:
find: forall (k, v). k v map * k -> v opt
insert: forall (k, v). k v map * k * v -> k v map
empty: forall (k, v). k v map
Quanto sopra sta dicendo che map è un type-constructor (anche chiamato tipo di tipo superiore ) che accetta un paio di tipi (k, v) e produce un nuovo tipo denotato k v map . Le tre funzioni elencate sono polimorfiche , che è evidente dalla quantificazione del tipo forall (k, v) . Ciò significa che il find è parametrizzato da un pait di tipi.
La corrispondenza tra il tipo map e una funzione è evidente nella nomenclatura - le funzioni sono spesso chiamate mappature.
Chiaramente, come hai capito, ogni map con le chiavi di tipo k e i valori di tipo v induce una funzione da k a v . Per dimostrarlo, possiamo semplicemente dimostrare una funzione polimorfica che converte da una all'altra (questa è chiamata trasformazione naturale nella teoria delle categorie, il polimorfismo di questa funzione è ciò che è significativo):
map_to_func: forall (k, v): k v map -> (k -> v)
map_to_func m = \key -> case find(m, key) of Some v -> v | None -> loop forever
Se m è totale - nel senso che ogni chiave può essere trovata nella mappa - allora anche map_to_func m è totale. Ma se m non ha un valore per ogni chiave, allora il risultato è una funzione parziale, il cui risultato è indefinito (calcolo non sospeso) per alcuni input.
Nota a margine: la tua definizione di funzione è leggermente errata. Per affermare una funzione è necessario che ogni elemento del dominio si riferisca a non più di un elemento nel codominio; infatti, ogni elemento nel dominio deve riguardare esattamente un elemento nel codominio.