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.