2011-07-07 32 views
6

Chương 3 định nghĩa kiểu đệ quy sau đây để đại diện cho một cây nhị phân:Real World Haskell Chương 3 excercise: Cây nhị phân với 1 giá trị constructor

data Tree a = Node a (Tree a) (Tree a) 
      | Empty 
       deriving (Show) 

Cuộc diễn tập đòi hỏi tôi thực hiện cùng loại sử dụng một constructor giá trị duy nhất, bằng cách sử dụng "Maybe" loại để đề cập đến các nút con:

(Từ Chương 3 Bài tập 2 trên trang 60)

"Xác định một loại cây mà chỉ có một nhà xây dựng, như ví dụ Java của chúng tôi Thay vì Empty. constructor, sử dụng kiểu Có thể để refe r cho trẻ em của một nút. "

Các giải pháp tôi đã đưa ra như sau:

data AltTree a = AltNode a (Maybe (AltTree a)) (Maybe (AltTree a)) 
       deriving (Show) 

Tuy nhiên, điều này không cho phép một cây có chứa cây rỗng khác, chẳng hạn như:

AltNode 1 (AltNode 2 Nothing Nothing) (AltNode 3 Nothing Nothing) 

Và tôi không chắc chắn tại sao, là "Không có gì" không phải là một hàm tạo giá trị cho kiểu "Có thể"?

+0

Online: [RWH> Chương 3> Các bài tập] (http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id585938) –

Trả lời

5

Đây không phải là hàm tạo giá trị Nothing gây ra lỗi của bạn. Hai chi nhánh bạn vượt qua cây cấp cao nhất phải có loại Maybe (AltTree a), nhưng cả hai (AltNode 2 Nothing Nothing)(AltNode 3 Nothing Nothing) đều có loại AltTree Int. Bạn phải sử dụng hàm tạo giá trị Just để tạo các giá trị của loại Maybe từ chúng. Giống như

AltNode 1 (Just (AltNode 2 Nothing Nothing)) (Just (AltNode 3 Nothing Nothing)) 
+3

@rr Ngoài ra, giải pháp là không đầy đủ - bạn không có giá trị tương đương với 'Empty'. Bạn cần phải cho phép 'AltNode Nothing Nothing Nothing'. Điều đó vẫn không hoàn toàn đúng, bởi vì bây giờ hệ thống kiểu có thể cho phép các nút rỗng có con. Có lẽ gói tất cả các đối số vào một tuple Có lẽ sẽ có ngữ nghĩa tốt hơn? –

+0

@Matajon, cảm ơn lời giải thích, điều đó có ý nghĩa bây giờ. Nhưng điều này không làm cho các loại khác với việc thực hiện chúng đưa ra trong cuốn sách? Hoặc có lẽ tôi đang đọc quá nhiều. –

+0

@Thomas M. DuBuisson Đó là một điểm tốt, tôi không hoàn toàn chắc chắn, tôi sẽ phải chơi xung quanh với nó. Cảm ơn. –