Come si modella ha una relazione (di aggregazione) nei linguaggi di programmazione funzionale

6

Solo per essere agli stessi termini:

L'aggregazione è una relazione has-a, in cui i componenti di proprietà possono esistere indipendentemente dal componente proprietario .E.g. un laghetto e alcune anatre che nuotano dentro. Un'anatra che lascia lo stagno non vuol dire che l'anatra rinunci alla sua esistenza.

In un linguaggio OO (o in realtà qualsiasi lingua senza trasparenza referenziale), puoi semplicemente usare puntatori o riferimenti per modellarlo. Tuttavia questo non è possibile in un linguaggio funzionale.

Qualcosa che ho trovato sono zippers , in cui praticamente conservi tutte queste realizzazioni in un albero delle relazioni e accedi a qualsiasi elemento con l'aiuto di zippers. Ma suona terribilmente gravoso.

    
posta hgiesel 24.07.2016 - 17:28
fonte

1 risposta

3

La risposta breve è che devi solo copiarlo in un contenitore e ricostruire il contenitore quando l'oggetto originale cambia. Questo non è così oneroso come potresti pensare.

In altri paradigmi, accettiamo l'accoppiamento stretto di un riferimento mutabile a causa della paura che cambierà l'oggetto a cui ci riferiamo e non accetteremo quel cambiamento. Con immutabilità quella paura non esiste. Le modifiche vengono apportate solo in luoghi facilmente definiti. Quando apporti modifiche agli oggetti sottostanti, puoi facilmente apportare modifiche o ricostruire gli aggregati associati nella stessa posizione.

La mutevolezza inoltre consente ai programmatori di mantenere solo una singola copia di ogni dato dato. Arrivano ad equiparare questo posto in memoria con l'identità di quel dato. A volte costruiscono enormi strutture di dati per fare riferimenti a luoghi nella memoria per preservare tale identità.

I programmatori funzionali arrivano a pensare a valori come identità dei dati. Il linguaggio di programmazione può implementarlo come riferimento allo stesso posto in memoria, ma ciò è irrilevante nel modo in cui ci si pensa. Invece di una massiccia struttura di dati che si riferisce allo stesso luogo , si utilizzano diverse piccole strutture di dati che si riferiscono allo stesso valore .

Talvolta questo valore è un po 'come un puntatore. Ad esempio, potrebbe essere un (row,column) di un tabellone. Quindi puoi impostare un Map da (row,column) a Piece per tutti i pezzi. Quindi puoi filtrare quella mappa per ottenere pezzi amichevoli e pezzi nemici. Quindi potresti passare queste liste in una funzione per ottenere un elenco di tutte le tue mosse valide in questo turno, dove un Move ha un da (row, column) , un a (row, column) e a Piece . Poi passi quell'elenco di mosse in una funzione AI che seleziona una mossa, e torniamo in cima e ricominciamo.

Qui, il (row, column) value semanticamente lega insieme la struttura dei dati della scheda di gioco e la struttura dei dati di movimento e gli elenchi di pezzi amichevoli, gli alberi decisionali di IA e così via, ma non lo sono fisicamente parte della stessa struttura dati. L'immutabilità ci consente di scindere molte strutture di dati derivati senza preoccuparci che non vadano fuori sincrono.

Se hai una struttura di dati complessa e complessa, ci sono modi per attraversarla e modificarla in modo funzionale, come obiettivi o cerniere, ma questi sono per casi d'uso in cui i tuoi dati sono già in una forma complessa, come Manipolazione XML, algoritmi ad albero, ecc. Non li useresti nei casi tipici in cui usi l'aggregazione per la programmazione orientata agli oggetti.

    
risposta data 27.07.2016 - 20:35
fonte

Leggi altre domande sui tag