【发布时间】:2014-09-26 01:23:39
【问题描述】:
我对 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"))
具体来说,创建该数据类型比我在课堂上尝试的简单数据类型更复杂。动物函数创建树,但它如何利用该类型来创建树?
然后用这个函数遍历它:
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)
我不确定这段代码是如何工作的,可能是因为我不确定这种数据类型如何允许我们制作树。我看不到的基本上是类型创建的“链接”以及该算法如何使用这些函数类型来创建树。
帮助理解这将是不可思议的,谢谢!
【问题讨论】:
-
还有一个问题——在遍历函数中,为什么它需要一个带有参数“a”和括号的“(Tree a)”?我从未见过函数接受这样的参数(通常只有一个词)。
标签: haskell recursion types tree