如何删除Haskell中两个字符串列表之间的公共元素?

时间:2017-12-22 15:05:45

标签: haskell

我是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"]

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

2 个答案:

答案 0 :(得分:5)

我认为这就是你想要的

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

修改: 您也可以直接使用notElem

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

答案 1 :(得分: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上查找这些功能以获取更多详细信息:)