使用折叠操作的haskell树

时间:2013-04-26 10:21:44

标签: haskell tree fold

如果使用folds给出此定义,我将如何编写包含平衡函数。

data Tree a = Tree a [Tree a]

treeFold :: (a -> [b] -> b) -> Tree a -> b
treeContains :: Eq a => a -> Tree a -> Bool
treeBalanced :: Tree a -> Bool

请注意,在上面的定义中,不允许使用空树,并且叶子是具有空子树列表的树。

包含函数确定树是否包含给定标签。

平衡函数确定树是否平衡。

如果树的高度不超过一个树,并且子树平衡,则树是平衡的

我到目前为止所获得的包含函数如下所示。

treeContains :: Eq a => a -> Tree a -> Bool
treeContains a = treeFold (\x y -> if a == x then True else ...)

那你怎么做其他部分表示......

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

在你学习的时候,I shall answer your question by asking you more questions


重新treeContains

  1. 您想在...中计算什么值?这应该是什么意思?它的类型是什么?

      

    ...中,您希望查找树中的下一个节点,并检查该节点是否是您所追求的。

    1. 哪个节点是下一个节点?如果当前节点有四个子树,我们为什么要这样做 想只检查其中一个?如果没有子树怎么办?

        

      检查您所关注的节点是否在根目录中。如果返回true,则检查它是否在任何子树中。如果返回true,则检查是否有子子树。如果有则检查那些子子树中的节点,否则返回false。

      1. 您说您应该检查breadth-first order中的节点。这是检查它们的最佳顺序吗?您还可以查看其他哪些订单?他们可能会更容易吗?
  2. y是什么意思?它的类型是什么?

      

    y是包含b类型元素的列表。

    1. 你能更具体一点吗? (我在treeContains的特定背景下提问, 不是treeFold的更一般的背景。)什么是b

        

      y是包含Tree a类型元素的列表(因此bTree a

      你确定吗?

      1. 你被告知treeContains :: Eq a => a -> Tree a -> Bool,那是什么 是treeContains a

      2. 的类型
      3. 您已决定treeContains a = treeFold (\x y -> if a == x then True else ...)。鉴于这一点以及您对上一个问题的回答,treeFold (\x y -> if a == x then True else ...)的类型是什么?

      4. 鉴于您对上一个问题的回答,并给出了答案 treeFold :: (a -> [b] -> b) -> Tree a -> b,是什么类型的 (\x y -> if a == x then True else ...)

      5. 鉴于您对上一个问题的回答,y的类型是什么?

    2. 这个值是什么意思?它会告诉你树中其他节点的信息吗? 整个子树?哪个?它告诉你什么呢?他们的大小?其 高度?他们是否平衡?关于他们内容的事情?

  3. 您可以从...计算y吗?你需要什么功能?它/它们的类型是什么?


  4. 重新treeBalanced

    1. 如果你想写一个函数treeHeight :: Tree a -> Int,你会怎么做?你会使用treeFold吗?

    2. 如果你想写一个函数treeHeightAndBalanced :: Tree a -> (Int, Bool),你会怎么做?

    3. 如果你已经有treeHeightAndBalanced :: Tree a -> (Int, Bool),你怎么能写treeBalanced :: Tree a -> Bool