如果使用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 ...)
那你怎么做其他部分表示......
非常感谢任何帮助。
答案 0 :(得分:5)
在你学习的时候,I shall answer your question by asking you more questions。
重新treeContains
:
您想在...
中计算什么值?这应该是什么意思?它的类型是什么?
在
...
中,您希望查找树中的下一个节点,并检查该节点是否是您所追求的。
哪个节点是下一个节点?如果当前节点有四个子树,我们为什么要这样做 想只检查其中一个?如果没有子树怎么办?
检查您所关注的节点是否在根目录中。如果返回true,则检查它是否在任何子树中。如果返回true,则检查是否有子子树。如果有则检查那些子子树中的节点,否则返回false。
y
是什么意思?它的类型是什么?
y
是包含b
类型元素的列表。
你能更具体一点吗? (我在treeContains
的特定背景下提问,
不是treeFold
的更一般的背景。)什么是b
?
y
是包含Tree a
类型元素的列表(因此b
为Tree a
)
你确定吗?
你被告知treeContains :: Eq a => a -> Tree a -> Bool
,那是什么
是treeContains a
?
您已决定treeContains a = treeFold (\x y -> if a == x then True else ...)
。鉴于这一点以及您对上一个问题的回答,treeFold (\x y -> if a == x then True else ...)
的类型是什么?
鉴于您对上一个问题的回答,并给出了答案
treeFold :: (a -> [b] -> b) -> Tree a -> b
,是什么类型的
(\x y -> if a == x then True else ...)
鉴于您对上一个问题的回答,y
的类型是什么?
这个值是什么意思?它会告诉你树中其他节点的信息吗? 整个子树?哪个?它告诉你什么呢?他们的大小?其 高度?他们是否平衡?关于他们内容的事情?
您可以从...
计算y
吗?你需要什么功能?它/它们的类型是什么?
重新treeBalanced
:
如果你想写一个函数treeHeight :: Tree a -> Int
,你会怎么做?你会使用treeFold
吗?
如果你想写一个函数treeHeightAndBalanced :: Tree a -> (Int, Bool)
,你会怎么做?
如果你已经有treeHeightAndBalanced :: Tree a -> (Int, Bool)
,你怎么能写treeBalanced :: Tree a -> Bool
?