2011-07-07 48 views
6

第3章定義了以下遞歸類型來表示二叉樹:真實世界哈斯克爾第3章鍛鍊; Tibial:二叉樹1個值構造

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

的工作需要我用一個值構造實現相同的類型,用「也許」型指子節點:

(從第60頁第3章練習2)

「定義一個只有一個構造函數,像我們的Java例如樹類型,而不是空的。構造函數,使用Maybe類型來參考r到節點的孩子。「

我想出瞭解決辦法如下:

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

然而,這不允許含有其他空的樹木,比如一棵樹:

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

而且我不肯定爲什麼,「Nothing」不是「Maybe」類型的值構造函數?

+0

在線:[RWH>第3章>練習](http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id585938) –

回答

5

這不是造成你的錯誤的值構造函數的Nothing。您傳遞到頂級樹的兩個分支應具有類型Maybe (AltTree a),但(AltNode 2 Nothing Nothing)(AltNode 3 Nothing Nothing)都有類型AltTree Int。您必須使用Just值構造函數從它們創建Maybe類型的值。像

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

@rr此外,該解決方案是不完整 - 您沒有與「Empty」等效的內容。你需要允許'AltNode Nothing Nothing Nothing'。這仍然不太正確,因爲現在類型系統可以允許有空的節點。也許將所有參數包裝到Maybe元組中會在語義上更好? –

+0

@Matajon,感謝您的解釋,現在有道理。但是這不會使這個類型與他們在書中給出的實現不同嗎?或者我也許正在閱讀這些內容。 –

+0

@Thomas M. DuBuisson這是一個很好的觀點,我不完全確定,我將不得不玩弄它。謝謝。 –