Haskell:反转 filter 谓词

问题: 在 Haskell 中,你打算使用反转的 filter 操作符进行过滤。

例如,你的代码是(GHCi):

example.hs
Prelude> import Data.List
Prelude Data.List> filter ( isPrefixOf "a" ) ["a","ab","cd","abcd","xyz"]
["a","ab","abcd"]

你需要的列表是 ["cd","yz"]。在某些情况下,最简单的解决方案是使用例如 <= 而不是 >,但并非所有函数都有字面补集,例如示例中使用的 isPrefixOf

解决方案:

你可以简单地组合 not 函数(组合通过使用组合操作符 . 完成)来否定谓词的结果。

example_negate.hs
Prelude> import Data.List
Prelude Data.List> filter ( not . isPrefixOf "a" ) ["a","ab","cd","abcd","xyz"]
["cd","xyz"]

注意 not isPrefixOf "a"(注意缺少组合操作符)不起作用,因为你正在将 not 应用于柯里化函数。not 只能应用于 Bool

更详细、更通用(但复杂得多)的解决方案在此 StackOverflow 文章中描述


Check out similar posts by category: Haskell