2012-08-31 47 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