【问题标题】:Filter with two conditions过滤两个条件
【发布时间】:2014-02-12 21:14:38
【问题描述】:

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

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

这也会删除 ('c', 'b', 2)。我是 haskell 新手,不知道是什么原因造成的。

谢谢

【问题讨论】:

  • 使用|| 而不是&&
  • 哦,那行得通。但我认为这是另一种方式,因为我希望在同一个元组中同时使用 'a' 'b'。
  • 也许(\(a,b,w) -> not (a == 'a' && b == 'b')) 更清楚。

标签: list haskell filter


【解决方案1】:
filter :: (a -> Bool) -> [a] -> [a]

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

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

这个过滤器什么时候返回True?如果a /= 'a'b /= 'b' 都为真,它只返回True

你的过滤器 b == 'b' b /= 'b' a == 'a' 假 假 a /= 'a' 假 真

但是,这不是你的意思。你想删除('a','b',_),所以你的过滤器应该像

以下过滤器 b == 'b' b /= 'b' a == 'a' 假 真 a /= 'a' 真真

您只想保留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'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 2022-01-13
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多