如果谓词成立,则从列表中删除项目

Removing items from a list if a predicate holds

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

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

我对 func->[a]->[a]func 部分感到困惑,因为我不知道该如何判断它是谓词。

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

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

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

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

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

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

三倍应该 return 一个布尔值,像这样:

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