Considera che ho una lista. Voglio scorrere su di esso e mappare i suoi elementi - ma la mappatura potrebbe anche richiedere di cambiare gli altri rispetto all'elemento che sto attualmente iterando.
Diciamo che ho un switch
(ha un campo di lista di light id che controlla, e campo bool se è acceso) e light
(ha un campo id e un campo bool se splende) tipi definiti. Voglio aggiornare la lista spegnendo tutti gli interruttori, e corrispondentemente spegnendo tutte le luci ad essi relative. Per esempio. Vorrei eseguire la mappatura, in modo tale lista come questa
(list
(light 'd #t)
(switch '(c) #f)
(light 'a #t)
...
(switch '(a b) #t)
...
(light 'b #t)
(light 'c #f))
diventa
(list
(light 'd #t)
(switch '(c) #f)
(light 'a #f)
...
(switch '(a b) #f)
...
(light 'b #f)
(light 'c #f))
Questo è un esempio banale, ma nell'uso attuale la lista potrebbe essere grande, il predicato di quale esattamente altri elementi dovrebbero essere cambiati non ovvio, e l'accoppiamento potrebbe dipendere dalla funzione - cioè la luce potrebbe dipendere non da un passare, ma da qualche altro elemento nel diverso contesto.
Qual è l'approccio migliore in modo funzionale e immutabile?
Credo che spegnere le luci sia un cattivo esempio, in quanto lo rende troppo banale. Sto cercando una soluzione più generale, in cui le azioni possono essere diverse tra gli elementi a seconda dei loro dati (e del loro controllore).
Le voci iniziale e di risultato devono essere in una struttura piatta (anche se non sono sicuro di quante siano oltre a liste / vettori)
La soluzione non dovrebbe presupporre che gli elementi siano facili da categorizzare (ad esempio perché la categorizzazione varia selvaggiamente a seconda del contesto in cui vengono utilizzati gli stessi dati)