Haskell树遍历困惑

时间:2014-08-03 10:53:17

标签: haskell recursion types tree

我对haskell很新,我似乎无法理解这段代码:

data Tree a = Empty | Leaf a | Node a (Tree a) (Tree a)

-- animals tree 
animals :: Tree String
animals = Node "elephant"
              (Node "bat"
                   (Leaf "aardvark")
                   (Node "cow"
                   (Leaf "chicken")
                    Empty))
              (Node "hare"
                   (Node "fox"
                         Empty
                         (Leaf "goat"))
                   (Leaf "jackal"))

具体来说,创建该数据类型比我在课堂上尝试的简单数据类型更复杂。 animals函数创建树,但它如何利用该类型呢?

然后用这个函数遍历它:

traverse :: (Tree a) -> [a]
traverse Empty = []
traverse (Leaf x) = [x] --leaf returns list of 1 item
traverse (Node x left_sub_tree right_sub_tree) =
 (traverse left_sub_tree) ++
  [x] ++
 (traverse right_sub_tree)

我不确定这段代码是如何工作的,可能是因为我不确定该数据类型如何让我们创建树。我看不到的基本上是类型创建的“链接”以及该算法如何使用这些函数类型来创建树。

帮助理解这将是不可思议的,谢谢!

1 个答案:

答案 0 :(得分:4)

数据类型递归地定义树。树由单元组成,每个单元可以是"空"," Leaf"或"节点"。 " Node" case有2个孩子也是树,这是递归定义。这个想法是树可以是空的,也可以是单个元素,或者是连接到另外两个树的单个元素。

traverse代码也递归工作。如果遇到空树,则返回一个空列表。如果遇到单个元素,则返回它。如果遇到"节点",则它会递归运行两​​个子树,然后将结果与++运算符组合。