2016-11-04 17 views
-3

2つのリストを指定すると、両方のリストからcommenにある要素を削除する関数を作成しようとしています。私はこれ以上私の頭を壊してきましたが、まともな解決策を考え出すことができませんでした。例えば2つのリストからcommen要素を削除する

、与えられた:

` let a = [1,2,3,4,5] ` 
` let b = [1,3,5,7,9] ` 
` f a b ` 

を次にFのようなものを返す必要があります:あなたは述語not.flip (elem)としてリストをフィルタリングすることができ

` ([2,4], [7,9]) ` 
+1

問題を小さなものに分割しようとしましたか?どこに問題がありますか?私はこれが宿題だと思っていますが、実際にはこの問題に遭遇した場合、まず「Set」か他のデータ構造が適切かどうかを検討してください。 – jberryman

+0

これは実際には実際には壊れています。一つのリストを他のリストよりもループさせてから、[Integer]リストを返す必要があるのは難しいです。私はしばしば、[[Integer]]リストを取得してしまい、リストごとに1つの要素しか削除しませんでした。リストやタプルの他に、Haskellの他のデータ構造を使っていないので、私は一見して、より良い仕事を見て、チップのおかげです。 – Henk

+0

ここでは、問題をより小さな部分に分割する例を挙げます。以下の関数を定義することができます: 'unionLists :: [Int] - > [Int] - > [Int]'(これは'delete :: Int - > [Int] - > [Int]'(最初のパラメータとして渡された要素が削除されたリストを返します)。次に、unionListsを定義するのに問題がある場合は、 'elem :: Int - > [Int] - > Bool'と' filter'、または 'merge'と' sort '賢い気分。 – jberryman

答えて

1

を:

f :: Eq a => [a] -> [a] -> ([a],[a]) 
f a b = (filter (not.flip (elem) b) a,filter (not.flip(elem) a) b) 

我々場合Data.Foldableをインポートすると、nonElemを使用してこのabを簡略化できますそれ以上:

f a b = (filter (`notElem` b) a,filter (`notElem` a) b) 
+1

'Data.Foldable.notElem'とセクションはこれを少しきれいにします:' '(' notElem'b) ''と '' not ''です。フリップ・エレムb'。 –

+1

フリップはどうしますか? hoogleによれば、その型は '(a→b→c)→(b→a→c)' '(not.flip(elem)b)'と ''(b。 '? – Henk

+2

@Henkいいえ、 'flip'は関数の引数を反転します。したがって、例えば、 'flip elem x y'は' elem y x'と同じです。 –

関連する問題