有时我让自己在 Haskell 中使用不同类型的树,但我不知道它们被称为什么,也不知道从哪里获得有关使用它们的算法或它们的类实例的更多信息,甚至不知道一些关于 hackage 的预先存在的代码或库。
例子:
标签在叶子或树枝上的二叉树:
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 并进行一些转换的代码的方法。在那儿?可能只是印象。