1

私はリストのリストを持っています、例えば[[1,1,3],[1,2,4],[4,4,4],[5,6,7]]

重複する要素を持つすべてのリストを削除したいのですが、たとえば[[1,2,4],[5,6,7]]

私の現在の問題は、のアプリケーションの述語を作成することですfilter。現在、フィルタリングされたリストの長さを、そのリストの予想される長さに対してテストしようとしています。ただし、の要素の関数として機能させるのに苦労していますlist

removeLoops :: [[Integer]] -> Integer -> [[Integer]]
removeLoops list vs = filter (genericLength(filter (==)) < vs) list

私は間違った木を吠えていますか?それとも単に述語の誤解ですか?

4

2 に答える 2

3

解決策はあなたが思っているよりも簡単だと思います。特定のリストに重複があるかどうかをテストする述語を使用して、リストをフィルタリングできます。

ls = [[1,1,3],[1,2,4],[4,4,4],[5,6,7]]
filtered = filter hasNoDuplicates ls

残っているのは、適切な述語を見つけることだけです。この場合、このnub関数は便利です。この関数はリストを取得し、重複することなくそのリストを返します。だからあなたは言うことができます:

import Data.List (nub)

hasNoDuplicates l = l == nub l
于 2012-11-19T12:36:08.483 に答える
2

これはあなたのために働くはずです。

removeListsWithDuplicatesは、ヘルパーhasDuplicatesを使用してリストのリストをフィルタリングします。単純。

removeListsWithDuplicates :: [[Integer]] -> [[Integer]]
removeListsWithDuplicates ls = filter (not . hasDuplicates) ls

hasDuplicates。空のリストには重複はありません。複数の要素を含むリストには、最初の要素がリストの残りの部分で繰り返されている場合、またはリストの残りの部分に他の重複がある場合にのみ、重複があります。

hasDuplicates :: [Integer] -> Bool
hasDuplicates [] = False
hasDuplicates (x:xs) = any (==x) xs || hasDuplicates xs
于 2012-11-19T12:35:53.007 に答える