2017-12-22 15 views
3

私はハスケルの初心者です。私は2つの文字列のリストを比較し、リスト間の共通要素を削除して、一意の要素を持つ新しいリストを返したいと思います。以下はHaskellの2つの文字列リスト間の共通要素を削除するには?

私が持っているコードです:上記のコードの

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つのリストを比較したいです文字列の - リストと文字列ではありません。

答えて

3

私はそれはあなたが

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

編集欲しいものだと思う: あなたはまた、として直接notElemを使用することができます。何をやるの三つの機能がありますData.List内

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

は、それが働いたありがとうございます。 –

+0

ようこそ。 – andrewnagyeb

+1

また、 'notElem'関数もあります。 – 4castle

2

フィルターで達成しようとしています。

intersect :: Eq a => [a] -> [a] -> [a]あなたのコードではremoveCommonWordsとまったく同じことをします。 は["apple","apple"]を生成します。

nub :: Eq a => [a] -> [a]と組み合わせると、(\\) :: Eq a => [a] -> [a] -> [a]と逆の効果があります。 nub list_1 \\ nub list_2["orange"]を生成します。

詳細はHoogle上でこれらの関数を検索します:)

関連する問題