[英]Filter a list of tuples on two conditions
我有一個看起來像這樣的元組列表:
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)]
如何創建過濾器功能以僅刪除第一個元素為“ AA”且第二個元素為“ BB”的元組? 正確的輸出應為:
[("AA","CC",2), ("VV","RR",4), ("XX","TT",5), ("BB","BB",6)]
布爾代數。 您要刪除的滿足條件
x == "AA" && y == "BB"
布爾代數指出
¬(x and y) = ¬x or ¬y
因此,您的lambda的條件應為
x /= "AA" || y /= "BB"
因為filter
保留提供的謂詞返回True
。
如您在文檔中所讀, filter ::(a-> Bool)-> [a]-> [a]返回滿足謂詞的那些元素的列表。 這意味着謂詞只對要保留的元素返回True
。
因此,通過改寫您的請求,我們希望保留所有第一個元素與“ AA”不同或第二個元素與“ BB”不同的三元組:
filter (\(x,y,_)-> x /= "AA" || y /= "BB" ) tups
如果您想要使自己的意圖更加明確的方法,請嘗試:
filter (\(x,y,_) -> not $ x == "AA" && y == "BB") tups
filter (\(x,y,_) -> x /= "AA" || y /= "BB") tups
會做你想做的事。 您混淆了&&
和||
操作員。 過濾器將獲取謂詞為true的所有內容,因此返回不包含"AA"
所有內容,並且返回y
不為“ BB”的所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.