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

Big*_*ile 4 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
Run Code Online (Sandbox Code Playgroud)

上面代码的输出:

["apple","apple"]
Run Code Online (Sandbox Code Playgroud)

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

预期产量:

["orange"]
Run Code Online (Sandbox Code Playgroud)

我还尝试了以下操作:

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

上面代码的输出是:

["orange"]
Run Code Online (Sandbox Code Playgroud)

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

And*_*uib 6

我想那就是你想要的

let removeCommonWords  xs ys = filter (\x -> not (x `elem` ys)) xs
Run Code Online (Sandbox Code Playgroud)

编辑:您也可以notElem直接用作:

let removeCommonWords  xs ys = filter (\x -> x `notElem` ys) xs
Run Code Online (Sandbox Code Playgroud)