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