Tôi đã suy nghĩ về cách thức thực hiện tương đương với unfold
cho các loại sau đây:Định nghĩa chính xác của `mở ra` cho một cây không được gắn thẻ là gì?
data Tree a = Node (Tree a) (Tree a) | Leaf a | Nil
Hiện chưa rõ ràng kể từ khi chuẩn unfold
cho các danh sách trả về giá trị và hạt giống tiếp theo. Đối với kiểu dữ liệu này, nó không có ý nghĩa, vì không có "giá trị" cho đến khi bạn đạt đến một nút lá. Bằng cách này, nó chỉ thực sự có ý nghĩa để trả lại hạt giống mới hoặc dừng lại với một giá trị. Tôi đang sử dụng định nghĩa này:
data Drive s a = Stop | Unit a | Branch s s deriving Show
unfold :: (t -> Drive t a) -> t -> Tree a
unfold fn x = case fn x of
Branch a b -> Node (unfold fn a) (unfold fn b)
Unit a -> Leaf a
Stop -> Nil
main = print $ unfold go 5 where
go 0 = Stop
go 1 = Unit 1
go n = Branch (n - 1) (n - 2)
Trong khi điều này có vẻ hiệu quả, tôi không chắc đây là cách nó được cho là vậy. Vì vậy, đó là câu hỏi: cách chính xác để làm điều đó là gì?
Um ... điều này trông giống như điều duy nhất mà bạn có thể làm. – dfeuer
Thật sao? Tôi đã khá chắc chắn rằng tôi đã làm một cái gì đó ngu ngốc ở đây, nhưng nếu nó là chính xác tôi chỉ có thể xóa các câu hỏi. – MaiaVictor
Câu hỏi không quan trọng, và nó có thể hữu ích cho người khác. – chi