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