1

我有一个看起来像这样的元组列表:

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)]
4

4 回答 4

8

布尔代数。您要删除的满足条件

x == "AA" && y == "BB"

布尔代数指出

¬(x and y) = ¬x or ¬y

因此,您的 lambda 条件应该是

x /= "AA" || y /= "BB"

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

于 2012-08-31T09:30:27.653 回答
6

正如您在文档中看到的那样,filter :: (a -> Bool) -> [a] -> [a]返回满足谓词的那些元素的列表。这意味着您的谓词必须True仅针对您要保留的元素返回。

因此,通过重新表述您的请求,我们希望保留所有第一个元素不同于“AA”或第二个元素不同于“BB”的三元组:

filter (\(x,y,_)-> x /= "AA" || y /= "BB" ) tups
于 2012-08-31T09:31:42.877 回答
1

如果您想要使您的意图更清晰的东西,请尝试:

filter (\(x,y,_) -> not $ x == "AA" && y == "BB") tups
于 2012-08-31T13:54:04.223 回答
0
filter (\(x,y,_) -> x /= "AA" || y /= "BB") tups

会做你想做的事。你混淆了&&||运算符。过滤器将获取谓词为真的所有内容,因此"AA"返回所有没有的内容,并返回所有y不是“BB”的内容。

于 2012-08-31T09:29:55.050 回答