我有一个这样的列表:[('a','b',13),('c','b',2),('c','d',4)]。我想删除元素('a','b',13),但我不能这样做:
filter (\(a,b,w) -> a /= 'a' && b /= 'b') theList
这也会删除('c','b',2)。我是哈斯凯尔的新手,并不知道是什么造成这种情况。
由于
答案 0 :(得分:8)
filter :: (a -> Bool) -> [a] -> [a]
现在,filter
删除了过滤器函数未返回的所有元素True
。让我们来看看你的过滤器:
(\(a,b,w) -> a /= 'a' && b /= 'b')
此过滤器何时返回True
?如果True
和a /= 'a'
都为真,则仅返回b /= 'b'
:
yourfilter b == 'b' b /= 'b' a == 'a' False False a /= 'a' False True
但是,这不是你的意思。您想删除('a','b',_)
,因此您的过滤器应该像
followingfilter b == 'b' b /= 'b' a == 'a' False True a /= 'a' True True
您只想将值保持在a /= 'a'
或 b /= 'b'
,因此您的逻辑组合应为||
:
(\(a, b, _) -> (a /= 'a' || b /= 'b'))
但是,我们也可以使用De Morgan's laws为左上角(a == 'a' && b == 'b'
)编写过滤器,并使用not
否定其结果:
(\(a, b, _) -> not (a == 'a' && b == 'b'))