Я пытался создать функциональный граф. Граф, который я создаю, не имеет циклов, поэтому он немного напоминает дерево, где некоторые узлы могут иметь более одного родителя.Функциональные графики
Проблема в том, что обновление. Обычным способом с деревом является переход к узлу, который нужно обновить, каждый шаг способа создания нового узла, который изменяется, чтобы указывать на новый дочерний узел, до тех пор, пока не будет достигнут фактический узел для изменения, кто на самом деле является данными изменилось.
Принимая этот подход, когда некоторые узлы имеют более одного родительского прерывания, потому что вы в конечном итоге «разделяете» узел. Узел, разделяемый между двумя родителями, становится двумя узлами с родительским каждым, одним (путь, по которому вы проходили, чтобы добраться до узла), имеющим новое значение, а другой родитель, содержащий дочерний элемент со старым значением.
Поэтому я вместо этого попытался сохранить родительские узлы внутри каждого узла, то есть узлы знают, кто их родители.
Это работает, но есть проблема. Если я обновляю узел, я должен обновить его родителей. Но потом для каждого из родителей я должен не только обновлять своих родителей, но и их детей, потому что их дети хранят родительский узел (ы), и этот родительский узел теперь изменился.
Итак, чтобы обновить одно значение узла, я должен обновить каждый узел на графике.
Другая идея, которая у меня была, заключалась в том, чтобы хранить родительские узлы в каждом узле, просто сохраняя «пути» к родительским узлам в каждом узле. Таким образом, мне не нужно обновлять дочерние элементы родителя, поскольку «путь» к родительскому объекту не изменился (хотя сам узел имеет).
Но, возможно, существует гораздо лучший способ построения функционального графика? Есть идеи? Я не против, если он не обрабатывает графики с циклами. Я кодирую в Haskell, но описание языка программирования не так уж и хорошо.
Очень простой способ хранения ваших узлов в 'STRef' или другом изменяемом контейнере. Если вы обновите значение внутри 'STRef', каждое ребро, которое содержит этот узел, получит новое значение. Я не знаю, соответствует ли это вашим требованиям для «функционального» графика. – user2407038