Hai due scelte qui:
- Fai i tuoi oggetti mutabili, poi basta usare esattamente le stesse tecniche come si farebbe in Java.
- Renderli immutabili, quindi rinunciare alle dipendenze bidirezionali.
Per capire perché, considerare la seguente trasformazione tra alberi (immutabili). Questi sono entrambi definiti con ogni nodo genitore in possesso di un elenco di nodi figlio, ma bambini non sanno i genitori:
a (a)
b (b)
c c
d --> (d)
e e
f f
g g
In particolare, il nodo d
è stato clonato con il nuovo valore. Per fare questo, abbiamo anche dovuto clonare tutti i nodi genitore (mostrati tra parentesi).
Se i nodi hanno tenuto il loro genitore, quindi c
avrebbe dovuto essere "aggiornato" per riflettere il nuovo b
nodo e e, f, g
avrebbe dovuto essere aggiornato per riflettere il nuovo a
nodo. Ad esempio, l'intero albero dovrebbe essere copiato!
Solo mantenendo le relazioni in una direzione, da padre a figlio, diventa possibile riutilizzare c, e, f, g
attraverso le versioni successive della struttura. Questa è una potente ottimizzazione ed è la chiave per scrivere algoritmi funzionali efficienti.
fonte
2010-10-31 09:19:06
È possibile utilizzare valori pigri e blocchi, come mostrato da Moritz. – Landei
@ Landei Grazie. Il testo è ora aggiornato. –