我有一个元组列表,如下所示:
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)
布尔代数.你想要删除的那些满足条件
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.
正如你可以阅读文档,filter ::(a - > Bool) - > [a] - > [a]返回满足谓词的那些元素的列表.这意味着您的谓词必须True仅返回您要保留的元素.
因此,通过重新描述您的请求,我们希望保留所有那些第一个元素与"AA"不同或者第二个元素与"BB"不同的三元组:
filter (\(x,y,_)-> x /= "AA" || y /= "BB" ) tups
Run Code Online (Sandbox Code Playgroud)