У меня нет большого опыта работы с Haskell, но, насколько я знаю, невозможно иметь круги в графе ссылок на чисто функциональных языках. Это означает, что:
- У вас не может быть двусторонних списков, дети на деревьях указывают на своих родителей и т. Д. *
- Обычно недостаточно изменить только один узел. Любой измененный узел требует изменений в каждом узле, начиная с «корня» структур данных вплоть до узла, который вы хотите изменить.
Суть в том, что я бы не стал брать алгоритм Java (или любой другой императивный язык) и пытаться преобразовать его в Haskell. Вместо этого попытайтесь найти более функциональный алгоритм (и, возможно, даже другую структуру данных) для решения проблемы.
EDIT:
Из вашего пояснения не совсем ясно, нужно ли вам лишать законной силы только прямой родительский объект измененного объекта или всех его предков в иерархии, но это на самом деле не имеет большого значения Поскольку аннулирование объекта в основном означает его изменение, а это невозможно, вам, в основном, нужно создать измененный дубликат этого объекта, а затем вам нужно указать на него родительский объект, поэтому вам также нужно создать новый объект , Это продолжается до тех пор, пока вы не доберетесь до корня. Если у вас есть рекурсия для обхода дерева, чтобы «изменить» ваш объект, то вы можете воссоздать путь от этого объекта к корню на выходе из рекурсии.
Надеюсь, это имело смысл. : S
* Как указано в комментариях jberryman и других ответах, в Хаскеле можно создавать круговые справочные графы, используя ленивую оценку.