두 개의 n-ary 트리가 같은지 확인하기 위해 Haskell에서 간단한 부울 함수를 구현하려고합니다.Haskell에서 두 개의 n-ary 트리가 같은지 확인하십시오.
내 코드는 다음과 같습니다
-- 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])
를이 나무가 동일하지 않기 때문에 제대로 false를 반환하지만 테스트를 시도하는 경우
treeEquals t (Node 3 [])
트리가 동일하므로 true를 반환하기 때문에 작동하지 않습니다.
내가 뭘 잘못하고 있는지 알아?
두 개의 목록 통과를 피하기 위해 zipWith를 사용하지 않고이 방법을 구현하는 더 좋은 방법이 있습니까? – JohnQ
'Leaf'를 이런 식으로 사용하면 중복 표현이됩니다 :'Node x []'vs'Leaf x'. 중복 표현은 일반적으로 정당한 이유 (예 : 일부 작업이 훨씬 빨라지는 경우)에만 사용해야합니다. 이 경우'Leaf' 생성자를 삭제하는 것이 가장 좋은 행동 일 것 같습니다. 또는,'Node' 생성자를'Node a (Tree a) [Tree a]'로 바꿀 수 있습니다. 왜 그럴까요? – dfeuer