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を使用するコードに変換する方法があるかもしれないと感じています。ある?ただの印象かもしれません。