Spero di scrivere un algoritmo per sincronizzare due strutture gerarchiche. Queste strutture potrebbero essere grafici di oggetti, dati memorizzati in tabelle di database relazionali, ecc. (Anche due strutture diverse, purché abbiano chiavi comparabili). La sincronizzazione sarà a senso unico, vale a dire, una struttura sarà il prototipo e l'altra sarà modificata per corrispondere.Sincronizzazione unidirezionale di due gerarchie
Diciamo che abbiamo una funzione sync
. Sarebbe necessario accettare il seguente:
objA
- il prototipoobjB
- l'oggetto da modificarekeyA
- funzione generatrice chiave perobjA
keyB
- funzione generatrice chiave perobjB
addB
- funzione per creare unobjB
(rendimenti id della nuovaobjB
)setB
- funzione per aggiornareobjB
remB
- funzione per eliminare unobjB
parB
- id del genitoreobjB
s' - questo è passato aaddB
per il contesto
Quindi dobbiamo this:
let sync (objA:'a) (objB:'b) (keyA:'a -> 'k) (keyB:'b -> 'k)
(addB:'p * 'a -> 'p) (setB:'a * 'b -> unit) (remB:'b -> unit)
(parB:'p) = ...
Ora qui è dove ho problemi. 'a
e 'b
sono gerarchici, quindi la funzione deve sapere quali proprietà di 'a
e di 'b
devono attraversare (una volta confrontate le proprie chiavi e decide che corrispondono finora e devono essere ulteriormente attraversate). Per queste proprietà "figlio", ha bisogno di tutti gli stessi argomenti passati alla sincronizzazione, ma per i loro rispettivi tipi.
Questo è quando è diventato evidente questo è un problema di struttura dei dati. Come posso concatenare queste informazioni in modo tale che l'oggetto radice possa essere passato a sync
e possa attraversare i grafici verso il basso? Il mio pensiero iniziale era quello di incorporare tutti gli argomenti in una classe, che avrebbe una proprietà figli (uno ResizeArray
dello stesso tipo). Ma con varie proprietà che hanno tipi diversi, non sono riuscito a capire come farlo funzionare, a meno di lanciare tipi dalla finestra e fare la maggior parte o tutti gli argomenti di tipo obj
.
Così qui sono le mie domande:
- C'è un metodo consolidato per fare questo già (non sono stato in grado di trovare qualsiasi cosa)
- struttura Quali dati potrebbe utilizzare per incapsulare il dati necessari per farlo funzionare?
Ho fatto del mio meglio per spiegarlo a fondo, ma se qualcosa rimane poco chiaro, si prega di chiedere, e proverò a fornire informazioni migliori.
Suppongo che avrai bisogno di una struttura dati intermedia su cui questo algoritmo funzionerà, anche per vari tipi di dati, avresti bisogno di trasformare questi dati nella struttura di dati intermedia, eseguire l'algo e quindi trasformarlo di nuovo in dati originali modulo – Ankur