Tôi khá mới với Haskell và tôi đang cố gắng để làm việc ra làm thế nào để đi qua một cây n-ary. Khi sản lượng tôi đang tìm cách để có được một danh sách các giá trị lá (như các chi nhánh không có giá trị), do đó cho testtree này sẽ là: 4,5Haskell n-ary cây traversal
Định nghĩa của tôi cho đến nay là:
data Tree a = Leaf a | Branch [Tree a] deriving (Show)
travTree :: Tree a -> [a]
travTree (Leaf x) = [x]
travTree (Branch (x:xs)) = travTree x : travTree xs
testtree = Branch [(Leaf "4"), (Leaf "5")]
Nhưng nó đưa ra lỗi:
Couldn't match expected type `Tree a'
against inferred type `[Tree a]'
In the first argument of `travTree', namely `xs'
In the second argument of `(:)', namely `travTree xs'
In the expression: travTree x : travTree xs
Tôi giả định đây là do xs là danh sách cây và mong đợi một cây kỳ dị. Có cách nào để làm việc này không? Tôi đã cố gắng chức năng bản đồ, dọc theo dòng:
travTree (Branch (x:xs)) = travTree x : map travTree xs
Nhưng sau đó nó than phiền của:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `travTree'
Tôi cũng đã cố gắng thay đổi chữ ký chức năng để:
travTree :: Tree a -> [b]
Lỗi này cung cấp cho:
Couldn't match expected type `a' against inferred type `[b]'
`a' is a rigid type variable bound by
the type signature for `travTree' at Main.hs:149:36
In the first argument of `(:)', namely `travTree x'
In the expression: travTree x : map travTree xs
In the definition of `travTree':
travTree (Branch (x : xs)) = travTree x : map travTree xs
Bất kỳ trợ giúp nào sẽ được đánh giá cao, vì vậy cảm ơn trước ..!
Câu trả lời đầu tiên của bạn với việc hiểu danh sách là hoàn toàn tốt ... nhưng tốt để thấy rằng bạn đồng ý với câu trả lời của tôi quá! – Nefrubyr
bạn cũng có thể sử dụng concatMap;) – hiena
Tôi thích giải pháp này vì nó phá vỡ nó xuống một chút. Tôi đồng ý, nó rõ ràng hơn hàm concatMap. Tôi cũng thích danh sách hiểu (mặc dù ban đầu phức tạp hơn một chút để hiểu), vì vậy cảm ơn một lần nữa! :-) – Matt