Ваш код дает определения того, что значит сравнивать два дерева.Например, для равенства:
instance Eq Utree where
Tree(p) == Tree(q) = p == q
Это говорит о том, что равенство двух деревьев совпадает с равенством их списков поддеревьев.Таким образом, в этом коде p
и q
являются списками .Равенство в списках заранее задано в Haskell, так как два дерева равны, если они имеют одинаковую длину, а элементы попарно равны.Поскольку элементы p
и q
являются деревьями , это рекурсивно вызывает сравнение равенства на деревьях.
Интуитивно это означает, что два дерева равны, если они имеют одинаковую форму.
Аналогично, порядок двух деревьев определяется в порядке упорядочения списка поддеревьев.
instance Ord Utree where
Tree(p) <= Tree(q) = p <= q
Порядок в списках в Haskell предопределен как лексикографическое упорядочение на основена порядок элементов, т.е. вы сравниваете два первых элемента.Опять же, это вызывает сравнение на деревьях рекурсивно.Если они отличаются, используйте это как ответ, в противном случае сравните следующие два элемента и т. Д. Если у вас заканчивается один список перед другим, самый короткий список стоит первым в порядке.
В этом случае это означает, что упорядочение этих деревьев примерно такое, как мы смотрим на крайнюю левую точку, в которой они различаются.На этом этапе «наименьшее» дерево стоит первым в порядке.
Например, предположим, у нас есть два дерева:
*Main> let a = Tree [Tree [], Tree [Tree []]]
*Main> let b = Tree [Tree [Tree []], Tree []]
*Main> compare a b
LT
Деревья в этом примере выглядят так:
* *
a = / \ b = / \
x * x *
/ /
* *
То есть a
меньше b
, потому что когда мы смотрим на крайнюю левую точку, где они различаются, x
, a
имеет пустое поддерево, тогда как b
имеет единственный узелесть.