2010-12-13 72 views
19

仍在學習哈斯克爾,我實在看不出樹木在Haskell

data Tree a = Leaf a | Branch [Tree a] 

data Tree a = Leaf a | Branch (Tree a) (Tree a) 

什麼是最好根據你之間的區別?這兩種寫作方式的含義是什麼?

回答

52

第一個分支包含樹的列表,因此可能包含任意數量的子樹。第二個是明確的兩個子樹,因此是二叉樹。

8

前者定義了一棵樹,其中每個分支可以有任意多個子樹(表示爲樹列表),而後者定義了一棵樹,其中每個分支恰好具有兩棵子樹。

換句話說,前者是一般樹,後者是二叉樹。

那麼選擇哪一個取決於您是要對一般樹還是二叉樹進行建模。

+0

好的,但在這兩種情況下,葉和分支都是由語言定義的,我定義了我自己的類型樹。不是嗎? – 2010-12-13 17:57:34

+3

@Stephane:不需要。在這兩種情況下,既沒有先前存在'Tree'類型也沒有構造函數'Leaf'和'Branch',並且用'data'定義來定義它們全部三個。 – sepp2k 2010-12-13 17:59:08

+3

嗨sepp2k-問題中定義的「一般樹」通常被稱爲玫瑰樹。有時候,它們是通過一個單獨的Leaf構造函數實現的 - 有時按照Data.Tree的方式,Branch構造函數攜帶數據。 – 2010-12-13 19:17:00

6

我已經把這個作爲一個答案,而不是評論,因此有一定的格式:

data Rose a = Branch a [Rose a] 
    deriving (Show) 


sample1 :: Rose Int 
sample1 = Branch 1 [Branch 2 [], Branch 3 [Branch 5 []], Branch 4 []] 

這是一樣的庫模塊Data.Tree,雖然Data.Tree採用現場標籤和一個鍵入同義詞。

我已經看到這棵樹和你的第一個定義叫做「玫瑰樹」,雖然它們有稍微不同的形狀,所以術語似乎並不完全精確。我的解釋是,它是嵌入在單個遞歸構造函數中的列表「[Rose a]」,它將其定義爲玫瑰樹。