2016-05-16 162 views
0

你好哈斯克爾社區,哈斯克爾 - 布爾RoseTree

由於玫瑰樹的通常的定義:

RoseTree a = Node a [RoseTree a] 

我一直在抓我的頭在這個特定功能的實現:

boolRoseTree :: Blocks -> Blocks -> RoseTree a -> Bool 
boolRoseTree blocksA blocksB roseTree 

其中Blocks只是一個[Int],它總是包含6個大於或等於0的元素。 現在函數我希望實施檢查blocksA的某個元素是否爲某個值,並且blocksB的某個元素也是某個值,並且如果條件滿足,則返回True。這是非常模糊的,所以允許我用一個例子闡明:

| (blocksA !! 0 == 1 || blocksA !! 0 == 10) && blocksB !! 1 /= 0 = True

即如果的blocksA所述第一元素是110blocksB所述第二元件不0,然後返回True。我希望對blocksA的所有元素都這樣做,但是每次元素增加+1。通過我的意思是下一個警衛將是:

| (blocksA !! 1 == 2 || blocksA !! 1 == 11) && blocksB !! 2 /= 0 = True 
| (blocksA !! 2 == 3 || blocksA !! 2 == 12) && blocksB !! 3 /= 0 = True 
| (blocksA !! 3 == 4 || blocksA !! 3 == 13) && blocksB !! 4 /= 0 = True 
| (blocksA !! 4 == 5 || blocksA !! 4 == 14) && blocksB !! 5 /= 0 = True 

很顯然,我可以警衛一長串代碼本,通過所有blocksA !! 0blocksA !! 1blocksA !! 2blocksA !! 3blocksA !! 4blocksA !! 5最終達到一個otherwise聲明往哪個返回False。然而,這可以通過玫瑰樹更有效地實現(我認爲)。

我想在玫瑰樹的第一層必須有六個節點,0到5代表樹的元素。然後,每個節點都必須有2個值,這兩個值是我想要的blocksA在列表的特定元素處的兩個值 - 但是,我也不得不檢查blocksB的對應元素是否不爲零。

我真的不知道從哪裏開始像這樣的問題......任何幫助將不勝感激。

+0

我編輯了你的問題,希望問題現在在語法上有效。但我仍然沒有看到玫瑰樹與此有什麼關係。 –

回答

1

不知道怎麼玫瑰樹就在這裏工作,但對於這個 數據結構:

checks = 
    [ ((0,0), [ (1, 10, 1) , (2, 11, 2) , (3, 12, 3) , (4, 13, 4) , (5, 14, 5) ]) 
    , ((1,..), [ ... ] 
    , ((2,..), [ ... ] 
    , ... 
    , ((5,..), [ ... ] 
    ] 

這裏是如何解構它:

[ ((0,0) [ (1, 10, 1) , (2, 11, 2) , (3, 12, 3) , (4, 13, 4) , (5, 14, 5) ] 
    i z  x y j  x y j  x y j  ... 

每組值i,z,x,yĴ對應 後衛:

| ((a !! i) == x || (a !! i) == y) && (b !! j /= z) = True 

要執行所有的檢查,只用一個列表理解:

func :: [Int] -> [Int] -> Bool 
func a b = or $ do ((i,z), triples) <- checks 
        (x,y,j) <- triples 
        return $ ((a !! i) == x || (a !! i) == y) && (b !! j /= z) 

所有的單子元素都是或-ED一起。由於懶惰,只要遇到第一個True檢查,函數將返回True。

+0

Willem Van Onsem - 對語法失敗表示歉意。 @ErikR - 事後看來,我想我正在嘗試做一些你不能做的事情。感謝您的幫助。 –