Иногда мне приходится использовать различные типы деревьев в Haskell, и я не знаю, как они называются или где получить больше информации об алгоритмах, использующих их, или об экземплярах классов для них, или даже о каком-то предварительно -существующем коде или библиотеке по взлому..
Примеры:
Бинарные деревья, в которых метки находятся на листьях или ветвях:
data BinTree1 a = Leaf |
Branch {label :: a, leftChild :: BinTree1 a, rightChild :: BinTree1 a}
data BinTree2 a = Leaf {label :: a} |
Branch {leftChild :: BinTree2 a, rightChild :: BinTree2 a}
Аналогично деревьям с метками для каждого дочернего узла или общей меткой для всех их дочерних элементов:
data Tree1 a = Branch {label :: a, children :: [Tree1 a]}
data Tree2 a = Branch {labelledChildren :: [(a, Tree2 a)]}
Иногда я начинаю использовать Tree2
, и каким-то образом в процессе разработки он рефакторится в Tree1
, что кажется более простым в обращении, но я никогда не задумывался об этом.Есть ли здесь какая-то двойственность?
Кроме того, если вы можете опубликовать другие виды деревьев, которые вы считаете полезными, пожалуйста, сделайте это.
В общем, :все, что вы расскажете мне об этих деревьях, будет полезно!:)
Спасибо.
РЕДАКТИРОВАТЬ:
Уточнение :это не домашнее задание. Просто я обычно заканчиваю тем, что использую эти типы данных и создаю экземпляры (Functor, Monad и т. д. )и, возможно, если я изменю их имена, я найду библиотеки с реализованным материалом и больше теоретической информации о них.
Обычно, когда библиотека на Hackage имеет в названии Tree, она реализует BinTree2 или какую-то версию не -бинарного дерева с метками только на листьях, поэтому мне кажется, что, возможно, Tree2 и BinTree2 имеют какое-то другое имя или идентификатор.
Также я чувствую, что может быть какая-то двойственность или изоморфизм, или способ превратить код, использующий Tree1, в код, использующий Tree2, с некоторым преобразованием. Есть? Может быть, это просто впечатление.