【问题标题】:removing tuples from list (Haskell)从列表中删除元组(Haskell)
【发布时间】:2015-05-22 00:29:56
【问题描述】:

我想写一个函数,它接受一个像这样的元组列表作为参数:

remove'  [ ("a", True), ("b", False), ("c", False), ("d", True) ]

我想返回一个以 False 作为第二个值的元组列表,所以我希望我的函数返回

[ ("b", False), ("c", False) ]

这是我目前所拥有的,但它不会在 GHCi 中加载。谁能帮我吗?谢谢

remove' :: [(a,b)] -> [(a,b)]
remove' [(a,b)] = [ c | c <- [(a,b)], c `notElem` True ]

【问题讨论】:

  • 你的函数只匹配一个包含单个元组的列表 ([(a, b]))。你可能想要更通用的东西,比如remove' list = ...

标签: list haskell tuples list-comprehension


【解决方案1】:

由于要匹配元组的第二个元素,因此需要从元组中选择第二个元素,并像这样将其与False 进行比较

remove' :: [(a, Bool)] -> [(a, Bool)]
remove' xs = [c | c <- xs, snd c == False]

snd 函数将从每个元组中获取第二个元素,并将它们与False 进行比较。只有当它们匹配时,它们才会被收集到结果列表中。

由于第二个元素是布尔值,您可以像这样使用not 函数

[c | c <- xs, (not . snd) c]

我们可以用这样的点符号来表达同样的意思

[c | c <- xs, not(snd(c))]

注意:在你的程序中,你有

remove' [(a,b)] = ...

这意味着,只有在使用大小为1 的元组列表调用 remove 时才会执行。你可以这样检查

remove' :: [(a, Bool)] -> [(a, Bool)]
remove' [(a, b)] = [(a, b)]

remove' [ ("a", True), ("b", False), ("c", False), ("d", True) ]

将打印

Non-exhaustive patterns in function remove'

这意味着您在函数定义中指定的模式并未涵盖所有可能的输入。由于我们需要处理任意长度的元组列表,我们在xs 中接受它并在列表理解中使用它。

【讨论】:

  • xs 是什么意思?我通常看到 xs 表示列表的结尾
  • xs 是包含元组列表的参数。
  • 感谢您的精彩解释!
【解决方案2】:

我很惊讶还没有人说

remove' = filter (not . snd)

【讨论】:

    【解决方案3】:

    您只需要过滤并选择 lambda 中的第二项:

    filter (\x -> (snd x) == False) [("a", False), ("b", True)]
    

    回复:

    [("a",False)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多