【问题标题】:Haskell Tree Traverse ConfusedHaskell 树遍历混淆
【发布时间】: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


【解决方案1】:

数据类型以递归方式定义树。树由单元组成,每个单元可以是“空”、“叶”或“节点”。 “节点”案例有 2 个子节点,它们也是树,这是递归定义。这个想法是,一棵树可以是空的,也可以是单个元素,也可以是连接到其他两棵树的单个元素。

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

【讨论】:

  • 谢谢你的完美解释
  • @darkphoton 您可以在答案和问题上使用向上箭头,提示“此答案很有帮助”。也许您想在此答案上单击它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2011-05-24
  • 2011-01-21
相关资源
最近更新 更多