Utilizzo di array associativi

Haskell:
Utilizzo di array associativi

Come fare:

Haskell non ha array associativi pronti all’uso allo stesso modo di alcuni altri linguaggi, ma offre una potente libreria standard chiamata Data.Map per lavorare con coppie chiave-valore. Rimbocchiamoci le maniche e vediamo come usarli!

Prima di tutto, assicurati di importarla:

import qualified Data.Map as Map

Creare una mappa è semplice. Creiamone una con alcuni linguaggi di programmazione e i loro paradigmi:

let languages = Map.fromList [("Haskell", "Funzionale"), ("Python", "Imperativo"), ("Prolog", "Logico")]

E ora, che ne dite di ottenere il paradigma di Haskell?

Map.lookup "Haskell" languages
-- output: Just "Funzionale"

Aggiungere un nuovo linguaggio è facile:

let languagesUpdated = Map.insert "Rust" "Sistemi" languages

E se volessimo elencare tutti i linguaggi? Usa Map.keys:

Map.keys languagesUpdated
-- output: ["Haskell", "Python", "Prolog", "Rust"]

Per elencare i paradigmi, usa Map.elems:

Map.elems languagesUpdated
-- output: ["Funzionale", "Imperativo", "Logico", "Sistemi"]

Queste operazioni di base dovrebbero coprire la maggior parte degli usi, ma c’è molto altro da esplorare in Data.Map!

Approfondimento

Il modulo Data.Map nella libreria standard di Haskell è costruito su alberi binari bilanciati, specificamente alberi AVL. Questa scelta garantisce che la maggior parte delle operazioni sulla mappa, come l’inserimento, l’eliminazione e la ricerca, possano essere effettuate in tempo O(log n), dove n è il numero di elementi nella mappa. È una scelta efficiente per molti casi d’uso, anche se non sempre la più veloce per tutti gli scenari.

C’è anche una sfumatura storica: prima che Data.Map diventasse la scelta prediletta, i programmatori Haskell spesso usavano liste di coppie per simulare gli array associativi. Tuttavia, le operazioni su tali strutture sono O(n) per la ricerca, rendendo Data.Map un notevole miglioramento in termini di prestazioni.

Ora, nonostante l’efficienza e l’utilità di Data.Map, non è sempre lo strumento migliore per ogni lavoro. Per compiti estremamente sensibili alle prestazioni, dove anche i tempi di ricerca O(log n) sono troppo lenti, o dove le chiavi sono sempre valori interi, gli array o le tabelle hash (tramite Data.HashMap) potrebbero offrire prestazioni migliori con tempi di accesso O(1).

L’ecosistema Haskell consente una varietà di strutture dati per soddisfare diverse esigenze, e Data.Map è una scelta eccellente per gli array associativi di uso generale, bilanciando facilità d’uso, flessibilità e prestazioni.