我对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)
我不确定这段代码是如何工作的,可能是因为我不确定该数据类型如何让我们创建树。我看不到的基本上是类型创建的“链接”以及该算法如何使用这些函数类型来创建树。
帮助理解这将是不可思议的,谢谢!
答案 0 :(得分:4)
数据类型递归地定义树。树由单元组成,每个单元可以是"空"," Leaf"或"节点"。 " Node" case有2个孩子也是树,这是递归定义。这个想法是树可以是空的,也可以是单个元素,或者是连接到另外两个树的单个元素。
traverse
代码也递归工作。如果遇到空树,则返回一个空列表。如果遇到单个元素,则返回它。如果遇到"节点",则它会递归运行两个子树,然后将结果与++
运算符组合。