2012-08-31 45 views
1

我有一個元組列表看起來像這個元組的列表:過濾兩個條件

let tups = [("AA","BB",1), 
      ("AA","CC",2), 
      ("AA","BB",3), 
      ("VV","RR",4), 
      ("XX","TT",5), 
      ("BB","BB",6)] 

我想篩選出的元組只有在第一個元素是AA和第二個元素是BB 。我試圖使用:

filter (\(x,y,_) -> x /= "AA" && y /= "BB") tups 

上述命令刪除任何元組,其中所述第一元件是「AA」或第二元件是「BB」。因此,輸出是:

[("VV","RR",4), ("XX","TT",5)] 

如何創建一個過濾功能,只除去元組,其中第一elemet爲「AA」,第二個要素是「BB」?正確的輸出sholuld是:

[("AA","CC",2), ("VV","RR",4), ("XX","TT",5), ("BB","BB",6)] 

回答

6

正如你可以閱讀文檔,filter :: (a -> Bool) -> [a] -> [a]返回滿足謂詞的那些元素的列表。這意味着您的謂詞必須僅返回True,因爲您要保留的元素。

因此,通過改寫您的要求,我們要保持所有的三元組,其第一個元素是從「AA」不同或二是從「BB」不同:

filter (\(x,y,_)-> x /= "AA" || y /= "BB") tups 
0
filter (\(x,y,_) -> x /= "AA" || y /= "BB") tups 

會做你想要它做的事情。你在混合運營商&&||。過濾器將得到謂詞爲真的所有東西,因此返回沒有返回"AA"的任何東西,並返回y不是「BB」的所有東西。

8

布爾代數。要刪除滿足條件

x == "AA" && y == "BB" 

布爾代數的那些規定,

¬(x and y) = ¬x or ¬y 

因此,對於您的拉姆達的條件應該是

x /= "AA" || y /= "BB" 

因爲filter不斷爲其提供的一切謂詞返回True

1

如果你想的東西這讓你的意圖更加清晰,請嘗試:

filter (\(x,y,_) -> not $ x == "AA" && y == "BB") tups