2014-09-30 101 views
0

我有一個元組來模式匹配,並以遞歸方式對每個元素執行一些操作。Haskell中的模式匹配操作

[(Int, Char, Int)] 

我發現我周圍如何正確模式匹配它來訪問每個元素像下面這樣:

((q1, s, q2):tss) 

這個我能做到的列表中的每個元素的一些檢查操作。我打算是遞歸地對元組中的其餘元素進行相同的操作,在這種情況下是tss。

這是我在這裏張貼的部分代碼:

case ts of 
[] -> False 
((q1, s, q2):tss) | not (q1 `elem` qs) -> False 
        | not (s `elem` qs) -> False 
        | not (q2 `elem` qs) -> False 

我應該怎樣做遞歸TSS上相同的測試? 想法將不勝感激。

+0

請至少發佈一個完整的定義。什麼是'qs'? – luqui 2014-09-30 07:47:05

+0

你想得到一個'布爾'的列表嗎?或者你想檢查是否所有元素fullfil你的財產(或者你想檢查至少有一個嗎?) – Carsten 2014-09-30 07:49:10

+0

最好,如果你只是給我們一個樣本輸入和所需的輸出;) – Carsten 2014-09-30 07:49:34

回答

5

首先,編寫測試功能

test (q1, s, q2) = q1 `elem` q1List && 
        s `elem` sList && 
        q2 `elem` q2List 

有了它,你可以遍歷

map test tss 

(使用mapfilterfold ...因爲你需要)。

一個直接方式做到這一點可以是

mapTest [] = [] 
mapTest (t:tss) = test t: mapTest tss 

(但是一個簡單的map

一個完整的例子

multipleCheck q1List sList q2List tss = traverse tss 
    where traverse []  = [] 
     traverse (t:tss) = check t: traverse tss 

     check (q1, s, q2) = q1 `elem` q1List && 
          s `elem` sList && 
          q2 `elem` q2List 

main = print $ multipleCheck [1..5] "abc" [2,3,5] [(1,'b',3), (1,'b',4)] 

與輸出

[True,False] 
1

Functi關於定義通常寫在條款中;返回布爾值表達式把守可以只用邏輯表達式來代替:

g qs [] = False    -- should be True 
g qs ((q1, s, q2):tss) = 
       ((q1 `elem` qs) && 
       (s `elem` qs) &&     -- the three checks 
       (q2 `elem` qs) &&) && g qs tss -- and the recursive call 

我們作爲一個參數傳遞給qsg使g訪問它。否則qs必須是全局預定義值。

對於任何輸入,您的基本大小寫返回值應該爲True,而不是False,否則您的函數將始終返回False。

順便提一句,g qs tss = all (\(a,b,c)-> all (`elem` qs) [a,b,c]) tss = and (map (\(a,b,c)-> all (`elem` qs) [a,b,c]) tss)alland都是所謂的"folds",所以g也是如此。

如果你想在每個元組進行相同的測試,並得到結果的列表後面作爲整體結果,你只需要改變你如何結合遞歸結果:

g qs [] = []    -- False  -- it is a list now, not a Boolean 
g qs ((q1, s, q2):tss) = 
       ((q1 `elem` qs) && 
       (s `elem` qs) &&    -- the three checks 
       (q2 `elem` qs) &&) : g qs tss -- and the recursive call 
         --   ^^^ here 

這就是今天的map從以上,只是沒有andmap也是一種「摺疊」。