我想在Haskell中實現一個簡單的布爾函數來檢查兩個n元樹是否相等。檢查兩個n-ary樹在Haskell中是否相等
我的代碼是:
-- This is the n-ary tree definition.
-- (I know "Leaf a" is not necessary but I prefer to write it for clarity)
data Tree a = Leaf a | Node a [Tree a]
deriving (Show)
-- This is a simple tree used for test purposes
t :: Tree Int
t = Node 3 [Node 5 [Leaf 11, Leaf 13, Leaf 15], Leaf 7, Leaf 9]
treeEquals :: Eq a => Tree a -> Tree a -> Bool
treeEquals (Leaf n1) (Leaf n2) = n1 == n2
treeEquals (Node n1 xs1) (Node n2 xs2) = n1 == n2 && and(zipWith (treeEquals) xs1 xs2)
treeEquals _ _ = False
我的問題是,如果我做的測試,如:
treeEquals t t
treeEquals t (Leaf 3)
treeEquals t (Node 3 [Leaf 7])
返回正確的錯誤,因爲樹是不相等的,但如果我嘗試測試如:
treeEquals t (Node 3 [])
它不起作用,因爲它返回true,因爲樹是等於的。
你知道我在做什麼錯嗎?
有沒有更好的方法來實現這個方法,而不使用zipWith避免兩個列表遍歷? – JohnQ
以這種方式使用'Leaf'實際上會導致冗餘表示:'Node x []'vs'Leaf x'。冗餘表示通常只應用於一個很好的理由(例如,如果它們允許某些操作更快)。在這種情況下,只需放下'Leaf'構造函數似乎是最好的行爲。或者,您可以將'Node'構造函數更改爲'Node a(Tree a)[Tree a]',但爲什麼要麻煩? – dfeuer