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

tur*_*tle 1 haskell

我有一个元组列表,如下所示:

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

我想过滤掉第一个元素AA和第二个元素的元组BB.我试图使用:

filter (\(x,y,_) -> x /= "AA" && y /= "BB") tups
Run Code Online (Sandbox Code Playgroud)

上面的命令删除第一个元素是"AA"或第二个元素是"BB"的任何元组.因此,输出是:

[("VV","RR",4), ("XX","TT",5)]
Run Code Online (Sandbox Code Playgroud)

如何创建一个过滤函数来仅删除第一个elemet为"AA"而第二个元素为"BB"的元组?正确的输出sholuld是:

[("AA","CC",2), ("VV","RR",4), ("XX","TT",5), ("BB","BB",6)]
Run Code Online (Sandbox Code Playgroud)

Mat*_*ton 8

布尔代数.你想要删除的那些满足条件

x == "AA" && y == "BB"
Run Code Online (Sandbox Code Playgroud)

布尔代数说明了这一点

¬(x and y) = ¬x or ¬y
Run Code Online (Sandbox Code Playgroud)

因此你的lambda的条件应该是

x /= "AA" || y /= "BB"
Run Code Online (Sandbox Code Playgroud)

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


Ric*_* T. 6

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

因此,通过重新描述您的请求,我们希望保留所有那些第一个元素与"AA"不同或者第二个元素与"BB"不同的三元组:

filter (\(x,y,_)-> x /= "AA" || y /= "BB" ) tups
Run Code Online (Sandbox Code Playgroud)