Я надеюсь написать алгоритм для синхронизации двух иерархических структур.Этими структурами могут быть графы объектов, данные, хранящиеся в таблицах реляционных баз данных и т. Д. (Даже две разные структуры, если они имеют сопоставимые ключи).Синхронизация будет односторонней, то есть одна структура будет прототипом, а другая будет изменена для соответствия.
Допустим, у нас есть функция sync
.Необходимо принять следующее:
objA
- прототип objB
- объект, подлежащий модификации keyA
-- функция генерации ключа для objA
keyB
- функция генерации ключа для objB
addB
- функция для создания objB
(возвращает идентификатор нового objB
) setB
- функция для обновления objB
remB
- функция для удаления objB
parB
- идентификаторродителя objB
- это передается addB
для контекста
Итак, у нас есть это:
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) = ...
Теперь вот где у меня проблемы.'a
и 'b
являются иерархическими, поэтому функция должна знать, какие свойства 'a
и 'b
она должна пройти (после того, как она сравнит их ключи и решит, что они совпадают до сих пор и должна пройти дальнейший обход).Для этих «дочерних» свойств ему нужны все те же аргументы, которые передаются для синхронизации, но для их соответствующих типов.
Это когда стало очевидно, что это проблема структуры данных.Как я могу связать воедино эту информацию так, чтобы корневой объект мог быть передан в sync
, и он мог пересечь графики вниз?Моей первоначальной мыслью было включение всех аргументов в класс, который имел бы свойство children (ResizeArray
того же типа).Но с различными свойствами, имеющими разные типы, я не мог найти способ заставить его работать, если не считать выбрасывания типов из окна и получения большинства или всех аргументов типа obj
.
Так вотмои вопросы:
- Существует ли уже устоявшийся способ сделать это (я ничего не смог найти)
- Какую структуру данных я мог бы использовать для инкапсуляции данныхнеобходимо, чтобы это сработало?
Я старался изо всех сил объяснить это подробно, но если что-то останется неясным, пожалуйста, спросите, и я постараюсь предоставить более подробную информацию.