Мы можем сгенерировать функцию, которая генерирует 2-кортеж, где первый элемент является суммой дерева, а второй элемент, сам Tree
:
addNode' :: Num a => Tree a -> (a, Tree a)
addNode' l@(LEAF x) = (x, l)
addNode' (NODE _ a b) = (sab, NODE sab ta tb)
where (sa, ta) = addNode' a
(sb, tb) = addNode' b
sab = sa + sb
Таким образом, мы оба должны взятьLEAF
и NODE
во внимание.Вероятно, нам нужно вычислить сумму рекурсивных сумм поддеревьев и суммировать их в узле, поэтому здесь более эффективно использовать 2-кортеж, чтобы сохранить результат суммирования.
затеммы можем определить функцию addNode
, которая распаковывает 2-кортеж и возвращает только последний элемент:
addNode :: Num a => Tree a -> Tree a
addNode = snd . addNode'
Таким образом, будет получено дерево типа:
Prelude> addNode tree1
NODE 32 (NODE 15 (NODE 9 (LEAF 4) (LEAF 5)) (LEAF 6)) (NODE 17 (LEAF 8) (LEAF 9))