2011-02-04 71 views
1

想象一下,一個四叉樹定義如下:爲Quadtrees寫入太多模式匹配?

data (Eq a, Show a) => QT a = C a | Q (QT a) (QT a) (QT a) (QT a) 
    deriving (Eq, Show) 

bad1 = Q u u u u where u = C 255 
bad2 = Q (C 0) (C 255) (Q u u u u) (C 64) where u = C 255 

構造函數允許您創建沒有很好地形成四叉樹。 bad1應該是簡單的ç255和bad2是無效的一點,因爲它的右下角四叉樹(出於同樣的原因,應該是Q (C 0) (C 255) (C 244) (C 64)

到目前爲止一切順利。檢查其良好的formness是一個簡單的檢查事項的。四叉樹內遞歸基本情況當所有內四叉樹的葉子,因此所有的顏色不應該是人人平等

wellformed :: (Eq a, Show a) => QT a -> Bool 
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4] 
wellformed (Q (C c1) (C c2) se (C c4))  = valid se 
-- continue defining patters to match e.g Q C C C, C Q Q C, and so on... 

問題我能避免鍵入所有比賽爲所有possi楓葉和四叉樹的組合?

如果我的問題很奇怪,請耐心等待,但這是我的第二天Haskell-seamless-learing!

+0

根據您感興趣的內容,您可以創建一個「統一」功能,檢測所有四個元素相等並將其轉換爲單個元素的「壞」情況。 – 2011-02-04 06:18:58

+0

@丹:當然,我已經做到了。我稱之爲「消毒」,並且與您所說的完全相同:P – gremo 2011-02-04 06:30:24

回答

4

沒關係......

wellformed :: (Eq a, Show a) => QT a -> Bool 
wellformed (C _) = True 
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4] 
wellformed (Q nw ne se sw) = wellformed nw && wellformed ne 
    && wellformed se && wellformed sw 

編輯:甚至更好:

wellformed :: (Eq a, Show a) => QT a -> Bool 
wellformed (C _) = True 
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4] 
wellformed (Q nw ne se sw) = all wellformed [nw, ne, se, sw] 

編輯:注意,綁定是錯誤,應該是:NW NE SW SE !