【问题标题】:Removing items from a list if a predicate holds如果谓词成立,则从列表中删除项目
【发布时间】:2016-01-14 09:15:17
【问题描述】:

我正在尝试制作一个将谓词和列表作为输入的函数。并从列表中删除谓词所在的所有元素。到目前为止,我有以下功能:

removeif :: func->[a]->[a]
removeif [] = []
removeif func (h:t)= if func then delete h (h:t) else removeif func t

我对@9​​87654323@ 的func 部分感到困惑,因为我不知道该如何判断它是谓词。

例如我想要的是我从终端给出这个命令

removeif threefolds [1,2,3,4,5,6,7,8,9]

threefolds 是我拥有的本地函数,它返回一个无限列表,其中包含三的倍数,我想从输入列表中删除这些倍数。我正在考虑将 threefold 设为 bool 函数,但不确定是否有必要。

【问题讨论】:

  • removeIf p = filter (not . p)
  • 我不明白这个问题。谓词是类型为a -> Bool 的函数,用于某些aif 的条件需要 Bool,所以如果你想使用类似的代码,你可以做的不多。
  • @Cactus 非常感谢,这是个好主意:)
  • @Bakuriu 非常感谢,我对此感到困惑,现在我很清楚谓词以及我应该如何继续。谢谢百万!!!! :)

标签: list haskell predicate


【解决方案1】:

谓词应该是a -> Bool 类型的函数。所以removeif的签名应该是

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

如果 threefolds 的类型为 a -> Bool,你会没事的 :-)

【讨论】:

    【解决方案2】:

    Threefolds 应该返回一个布尔值,如下所示:

       let threefolds x =  x `mod` 3 == 0
    

    【讨论】:

    • 谢谢,我试试看:)
    • 然后按照您在 removeIf 的定义中所说的仙人掌使用过滤器:
    猜你喜欢
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2016-01-10
    • 2012-02-19
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多