Ho notato che la maggior parte dei linguaggi funzionali utilizza un elenco collegato singolarmente (un elenco "contro") come tipi di elenchi più fondamentali. Gli esempi includono Common Lisp, Haskell e F #. Ciò è diverso dalle lingue tradizionali, in cui i tipi di elenchi nativi sono array.
Perché?
Per Common Lisp (essendo digitato in modo dinamico) ho l'idea che i contro siano abbastanza generici da essere anche la base di liste, alberi, ecc. Questo potrebbe essere un piccolo motivo.
Per le lingue tipicamente statiche, tuttavia, non riesco a trovare un buon ragionamento, posso persino trovare contro-argomenti:
- Lo stile funzionale incoraggia l'immutabilità, quindi la facilità di inserimento dell'elenco collegato è meno vantaggiosa,
- Lo stile funzionale incoraggia l'immutabilità, quindi anche la condivisione dei dati; un array è più facile da condividere "parzialmente" di un elenco collegato,
- Puoi anche fare corrispondenze di pattern su un array normale, e ancora meglio (potresti facilmente piegare da destra a sinistra per esempio),
- Inoltre, ottieni l'accesso casuale gratuito,
- E (un vantaggio pratico) se la lingua è digitata staticamente, puoi utilizzare un normale layout di memoria e ottenere un aumento di velocità dalla cache.
Quindi perché preferire gli elenchi collegati?
an array is easier to share "partially" than a linked list
occorra chiarire cosa intendi. A causa della loro natura ricorsiva, è vero il contrario, per quanto io lo capisca: è possibile condividere parzialmente un elenco collegato più facilmente passando lungo qualsiasi nodo in esso, mentre un array dovrebbe impiegare del tempo per fare una nuova copia. O in termini di condivisione dei dati, due elenchi collegati possono puntare allo stesso suffisso, il che è semplicemente impossibile con gli array.