Programmazione funzionale: modifica degli elementi correlati durante la mappatura degli elenchi

1

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)

    
posta Coderino Javarino 24.12.2018 - 21:37
fonte

1 risposta

2

Parte di ciò che stai facendo è fondamentalmente una sorta di join (si pensi a sql o modello relazionale) per interrogare qualche sottoinsieme di dati che è archiviato in un elenco semplice.

Hai anche una struttura dati che non è particolarmente amichevole verso questo join.

Ecco alcune opzioni:

  • Se vuoi mantenere le liste piatte senza un particolare ordinamento tra gli elementi, fai due passaggi sopra l'elenco: il primo passaggio sopra l'elenco genera un nuovo elenco - di id di luci da spegnere - e il secondo passare (la mappa) sulla lista originale (prende anche la lista di identificazione intermedia) e li spegne.

  • Separa gli articoli in base al loro tipo in elenchi diversi. Il vantaggio qui è che gli elenchi (ad esempio degli switch) saranno più piccoli di quanto non fosse l'intera lista, il che può essere utile per un set di dati molto ampio. Quindi applica qualcosa dall'alto.

  • Se i dati sono strettamente gerarchici (una luce appartiene a un solo switch), quindi memorizzarli in questo modo per rendere i join estremamente semplici. Per una struttura di dati dell'elenco, questo significa (se necessario) l'archiviazione degli elenchi all'interno degli elenchi.

  • Se i dati sono parzialmente gerarchici, ad es. una luce appartiene a un insieme di interruttori (ad esempio per interruttori a tre vie), quindi crea un tipo o struttura che rappresenta un insieme di interruttori correlati, che quindi mantiene gli interruttori e amp; le luci: un tipo di questo tipo potrebbe supportare la modellazione con gerarchia.

risposta data 25.12.2018 - 01:06
fonte

Leggi altre domande sui tag