簡體   English   中英

在兩個條件下過濾元組列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM