【问题标题】:How does a non-binary-tree work in Haskell?Haskell 中的非二叉树如何工作?
【发布时间】:2021-10-26 13:35:22
【问题描述】:

我目前正在学习 Haskell,但我很难掌握非二叉树的工作原理(我对二叉树也不是很熟悉,但我已经对它有了初步的了解)。

所以我定义了以下数据类型:

data Tree = Node a [Tree]

我很难理解数据类型“Tree”是如何在内存中设置的,你如何称呼它,以及我应该如何在我的第一个Node a 中引用[Tree] 的列表。

以下示例不起作用,它说明了我在 Haskell 中抓取树结构时遇到的问题:

t1 = Node 10
t2 = Node 20
t3 = Node 30 [t1, t2]

我对面向对象语言如何处理树感到更加自在,如果有人能解释并与面向对象语言进行比较,我将不胜感激。

【问题讨论】:

    标签: haskell tree


    【解决方案1】:

    您的数据类型定义错误,无法编译。它需要如下:

    data Tree a = Node a [Tree a]
    

    你可以按如下方式使用它:

    λ> t1 = Node 10 []
    λ> t2 = Node 20 []
    λ> t3 = Node 30 [t1, t2]
    

    data Tree = Node a [Tree] 不正确的原因是您在构造函数中引用了一个未定义的变量a,该变量必须在类型构造函数中设置。另外,由于[]接受Tree a类型的元素,Tree a必须设置在[]中。

    除了带有数据声明之外,值声明不起作用的原因是每个Node 构造函数都接受2 个参数,而您在这里只传递一个t1 = Node 10。即使一个节点没有子节点,你也需要给它一个空列表作为参数。

    现在,出于演示目的,如果我们将数据类型更改为以下内容:

    data Tree a = Node a [Tree a] deriving Show
    

    我们可以打印t3的输出:

    λ> t1 = Node 10 []
    λ> t2 = Node 20 []
    λ> t3 = Node 30 [t1, t2]
    λ> t3
    Node 30 [Node 10 [],Node 20 []]
    

    【讨论】:

    • 谢谢你的回答,让我明白了很多。
    • 不客气 :D。通过研究这些问题并尝试找到解决方案,我也学到了很多东西。
    • 我可以问你一个后续问题吗?如果我想将我的树传递给一个函数并在 [] 内遍历我的树,我该怎么做?对于作为数据 BSTree 叶的 BinaryTree |具有函数 sumTree :: BSTree -> 整数的节点(BSTree 左)(BSTree 右)
    • 您的孩子被包裹在一个列表(可折叠)中,因此您需要使用fold 家族和类似的函数,或者您需要显式递归列表的元素并保留在请注意,这些元素中的每一个也是树节点,需要递归检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多