过滤两个条件

时间:2014-02-12 11:20:31

标签: list haskell filter

我有一个这样的列表:[('a','b',13),('c','b',2),('c','d',4)]。我想删除元素('a','b',13),但我不能这样做:

filter (\(a,b,w) -> a /= 'a' && b /= 'b') theList

这也会删除('c','b',2)。我是哈斯凯尔的新手,并不知道是什么造成这种情况。

由于

1 个答案:

答案 0 :(得分:8)

filter :: (a -> Bool) -> [a] -> [a]

现在,filter删除了过滤器函数未返回的所有元素True。让我们来看看你的过滤器:

(\(a,b,w) -> a /= 'a' && b /= 'b')

此过滤器何时返回True?如果Truea /= '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'))