【问题标题】:How to remove common elements between two lists of strings in Haskell?如何删除Haskell中两个字符串列表之间的公共元素?
【发布时间】:2017-12-22 15:05:45
【问题描述】:

我是 Haskell 的初学者。我想比较两个字符串列表并删除列表之间的公共元素并返回一个具有唯一元素的新列表。

下面是我的代码:

Prelude Data.List> let list_1 = ["apple", "orange", "apple"]
Prelude Data.List> let list_2 = ["apple"]
Prelude Data.List> let removeCommonWords  xs ys = filter (\x -> x `elem` ys) xs
Prelude Data.List> removeCommonWords list_1 list_2

以上代码的输出:

["apple","apple"]

目前,filter 函数正在过滤常用词并返回一个包含常用词的新列表。但是,我希望它返回一个包含唯一单词的新列表。我想我需要一个新的过滤器正则表达式。

预期输出:

["orange"]

我还尝试了以下方法:

Prelude Data.List> let removeCommonWords  xs ys = filter (\x -> x `elem` ys) xs
Prelude Data.List> remove ["orange", "apple", "apple"] "apple" 

以上代码的输出为:

["orange"]

但是,我想比较两个字符串列表 - 而不是列表和字符串。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    我想这就是你想要的

    let removeCommonWords  xs ys = filter (\x -> not (x `elem` ys)) xs
    

    编辑: 也可以直接使用notElem

    let removeCommonWords  xs ys = filter (\x -> x `notElem` ys) xs
    

    【讨论】:

    • 还有notElem函数。
    【解决方案2】:

    在 Data.List 中,有三个函数可以完成您想要通过过滤器实现的功能。

    intersect :: Eq a => [a] -> [a] -> [a]removeCommonWords 在您的代码中所做的完全相同。 intersect list_1 list_2 将产生["apple","apple"]

    nub :: Eq a => [a] -> [a](\\) :: Eq a => [a] -> [a] -> [a] 结合使用会得到相反的结果。 nub list_1 \\ nub list_2 将产生["orange"]

    Hoogle 上查找这些函数以获取更多详细信息:)

    【讨论】:

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