[英]haskell tree using fold operation
給定使用折疊的定義,我將如何編寫一個contains , 平衡函數。
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函數。
treeContains :: Eq a => a -> Tree a -> Bool
treeContains a = treeFold (\x y -> if a == x then True else ...)
那么,您如何做其他部分呢?
任何幫助將不勝感激。
在您學習時, 我將通過問您更多問題來回答您的問題 。
Re treeContains
:
您要在...
計算什么值? 什么意思 它是什么類型?
在
...
,您要查找樹中的下一個節點,然后檢查該節點是否在您要的位置。
下一個節點是哪個節點? 如果當前節點有四個子樹,為什么我們只想檢查其中一個? 如果沒有子樹怎么辦?
檢查您要尋找的節點是否在根目錄中。 如果返回true,否則檢查它是否在任何子樹中。 如果返回true,否則檢查是否有任何子子樹。 如果存在,則檢查那些子子樹中的節點,否則返回false。
y
是什么意思? 它是什么類型?
y
是包含類型b
元素的列表。
你可以說得更詳細點嗎? (我是在treeContains
的特定上下文中treeContains
,而不是在treeContains
的更一般的上下文中treeFold
。) b
是什么?
y
是一個包含類型為Tree a
元素的列表(因此b
是Tree a
)
你確定嗎?
有人告訴您treeContains :: Eq a => a -> Tree a -> Bool
treeContains a
treeContains :: Eq a => a -> Tree a -> Bool
,那么treeContains a
什么類型?
您已經確定treeContains a = treeFold (\\xy -> if a == x then True else ...)
。 鑒於此以及您對上一個問題的回答, treeFold (\\xy -> if a == x then True else ...)
是什么類型treeFold (\\xy -> if a == x then True else ...)
?
給定您對上一個問題的答案,並給定treeFold :: (a -> [b] -> b) -> Tree a -> b
, (\\xy -> if a == x then True else ...)
的類型是什么? (\\xy -> 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
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.