У меня есть деревья вида:
data Tree a = Leaf | Node (Tree a) a (Tree a)
Я создал функцию для поиска значения узла в дереве по порядку обхода слева направо.
getElem :: Tree a -> Int -> Maybe a
getElem Leaf _ = Nothing
getElem (Node l x r) n
| s == n = Just x
| n < s = getElem l n
| otherwise = getElem r (n - s - 1)
where
s = size l
Теперь я хочу написать метод, чтобы иметь возможность обновлять дерево.Он должен иметь возможность принимать дерево, индекс и значение и обновлять узел с этим индексом значением.Пока у меня есть:
update :: Tree a -> Int -> a -> Tree a
update Leaf _ _ = Leaf
update (Node l x r) index c
| s == index = (Node l c r)
| index < s = update l index c
| otherwise = update r (index - s - 1) c
where
s = size l
Эта функция может быть добавлена, но она, очевидно, возвращает только сам добавленный узел.Я хочу иметь возможность вернуть все дерево после «обновления» с новым узлом или вернуть дерево как есть, если индекс выходит за пределы.
Может кто-нибудь подсказать мне, как поступить с этим?
Редактировать 1:
Хорошо, я понимаю, что я в основном отбрасываю остаток моего дерева, когда возвращаюсь сюда.Итак:
update :: Tree a -> Int -> a -> Tree a
update Leaf _ _ = Leaf
update (Node l x r) index c
| s == index = (Node l c r)
| index < s = update (Node l2 x r) index c
| otherwise = update (Node l x r2) (index - s - 1) c
where
s = size l
l2 = l
r2 = r
Редактировать 2 (Глупый я!):
update :: Tree a -> Int -> a -> Tree a
update Leaf _ _ = Leaf
update (Node l x r) index c
| s == index = (Node l c r)
| index < s = (Node (upd l index c) x r)
| otherwise = (Node l x (upd r (index - s - 1) c))
where
s = size l
Мне понадобилось немного времени, чтобы обернуть голову вокруг него.Спасибо за комментарии!