Haskell 中的非二叉树如何工作?

How does a non-binary-tree work in Haskell?

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

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

data Tree = Node a [Tree]

我正在努力理解数据类型“Tree”在内存中的设置方式、如何调用它以及我应该如何在我的第一个 [=] 中引用 [Tree] 的列表15=].

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

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

我对面向对象语言处理树的方式更加满意,如果有人能解释并与面向对象语言进行比较,我将不胜感激。

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

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 []]