我有一个看起来像这样的元组列表:
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)]
答案 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”的所有内容。