2015-02-15 11 views
5

Secondo F # 's listdocumentation:Perché implementare un elenco immutabile come elenco collegato?

  • "Una lista in F # è un ordinato, immutabile serie di elementi dello stesso tipo"

  • "elenchi in F # sono implementati come elenchi collegati singolarmente "

Perché non implementarlo in modo contiguo in memoria poiché è immutabile e quindi ha una dimensione fissa? Perché usare mai un F # list invece di un F # array?

+1

Correlati: [Perché esistono elenchi di controllo associati alla programmazione funzionale?] (Http://programmers.stackexchange.com/questions/132309/why-are-cons-lists-associati-con-funzionalità-programmazione) – ryanpattison

+1

Una cosa da considerare è che le liste non sono effettivamente dimensioni fisse - scrivi un sacco di codice che assomiglia a 'se qualcosa poi a: :(recurse ...) else []' qui, costruendo la lista con una lista collegata è naturale –

+1

@JohnPalmer sì, sono * sono * dimensione fissa. Quando anteponi un elemento, questo crea un * nuovo elenco *. L'elenco originale esiste ancora e non è stato modificato in alcun modo. – latkin

risposta

3

Servono scopi diversi, ad esempio:

Si utilizza una matrice in F # per memorizzare grandi quantità di dati che devono essere accessibili in modo casuale con relativa basso overhead.

Un elenco in F # è utile quando è necessario accumulare qualcosa su iterazioni di una funzione ricorsiva. Gli array non giocano bene qui, dato che hanno una dimensione fissa.

Con un list, è possibile anteporre tutti gli elementi di ListM (dimensione M) a ListN (dimensione N) in O (M). Allo stesso modo, puoi anteporre un singolo elemento a qualsiasi elenco in O (1).

+1

Grazie per la risposta. Ma non ci credo ancora: P. Nel caso in cui un metodo ricorsivo concatena 'ListA' e' ListB', punta la coda di 'ListA' alla testa di' ListB'. Ma l'idea che tu possa modificare il punto in cui il nodo di coda di 'ListA' sta puntando sarebbe in contraddizione con il fatto che' ListA' è immutabile. Questo è il mio ragionamento; per favore correggi dove ho sbagliato – user2588666

+0

La cosa è che in genere i metodi ricorsivi non concatenano, aggiungono che non è lo stesso. Aggiungono un elemento alla raccolta per iterazione. Aggiungendo a una lista collegata è molto più economico rispetto a farlo su un array. – Gustavo

+0

Quando dici "append", intendi che crea un elenco completamente nuovo contenente ListA e ListB? – user2588666

Problemi correlati