【问题标题】:haskell tree using fold operation使用折叠操作的haskell树
【发布时间】:2013-04-27 18:40:51
【问题描述】:

给定这个使用折叠的定义,我将如何编写一个包含平衡函数。

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

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

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

balanced函数确定树是否平衡。

如果一棵树的子树的高度相差最多1个,则该树是平衡的,并且子树是平衡的

我目前得到的 contains 函数如下所示。

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

那么你怎么做...指示的else部分

任何帮助将不胜感激。

【问题讨论】:

  • 查看前奏中的函数andorany。特别要弄清楚你应该写什么类型的术语来代替...

标签: haskell tree fold


【解决方案1】:

在学习过程中,I shall answer your question by asking you more questions


回复treeContains:

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

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

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

      检查您所追求的节点是否在根目录中。如果它返回真,否则检查它是否在任何子树中。如果返回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. 你已经决定treeContains a = treeFold (\x y -> if a == x then True else ...)。鉴于此以及您对上一个问题的回答,treeFold (\x y -> if a == x then True else ...) 的类型是什么?

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

      4. 根据您对上一个问题的回答,y 的类型是什么?

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

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


回复treeBalanced:

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

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

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

【讨论】:

  • treeContains 在...中,您要查找树中的下一个节点并检查该节点是否是您所追求的。 y 是包含 b 类型元素的列表。
  • 检查你要的节点是否在根目录下。如果它返回真,否则检查它是否在任何子树中。如果返回true,否则检查是否有任何子子树。如果有则检查那些子子树中的节点,否则返回false。 y 是一个包含 Tree a 类型元素的列表
  • @Ishan 查看我编辑的额外问题。您可能应该先解决 2.1 下的问题,然后回答 2.2,然后重新访问 1.1。
  • treeContains 接受一个 a 和 Tree a 类型的树并返回一个布尔值。 treeContains 的类型是a -> Tree a -> BooltreeFold 函数接受 (a -> [b] -> b) 类型的函数和 Tree a 类型的树,并通过递归地对子树应用折叠操作返回结果,然后将函数应用于根处的标签,并从子树。树折叠操作的类型是(a -> [b] -> b) -> Tree a -> b
  • (\x y -> if a == x then True else ...)的类型为(a -> [b] -> b),x的类型为a,y的类型为[b]if a == x then True else ..的类型。是b。 y 值告诉您子树中的节点数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2014-02-13
相关资源
最近更新 更多