在两个条件下过滤元组列表

时间:2012-08-31 09:19:46

标签: haskell

我有一个看起来像这样的元组列表:

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)]

4 个答案:

答案 0 :(得分:8)

布尔代数。您要删除的那些符合条件

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

布尔代数声明

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

因此lambda的条件应为

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

因为filter保留了提供的谓词返回True的所有内容。

答案 1 :(得分:6)

正如您可以阅读文档一样,filter :: (a -> Bool) -> [a] -> [a]返回满足谓词的元素列表。这意味着您的谓词必须仅为您要保留的元素返回True

所以,通过改写你的请求,我们希望保留所有那些第一个元素与“AA”不同或者第二个元素与“BB”不同的三元组:

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

答案 2 :(得分:1)

如果你想要一些让你的意图更清晰的东西,试试:

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

答案 3 :(得分:0)

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

会做你想做的事。您正在混淆&&||运营商。过滤器将获得谓词为真的所有内容,因此返回任何没有"AA"的内容,并返回y不是“BB”的所有内容。