2

それで、それが問題である一口を説明するために...

フィルタを使おうとしていますが、どこにも行きません。これが私が望む振る舞いです。(の)リストのリストが与えられた、Integerすなわち

[[1,2,3],[23456,4,3,2],[1,3,4,5,6],[3,2,1],[4,2,1],[5,6,7],[1,2,5]]

別のリスト、つまり、これらの要素の両方[1,2]を含むすべてのリストを取得したいと思います。(他のいずれかが現時点で保存されているかどうかは関係ありませんが、後で必要になる可能性があります)。したがって、この例では、私の出力は次のようになります。

[[1,2],[2,1],[2,1],[1,2]]

またはできれば

[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]
4

4 に答える 4

5

まず、あるリストの要素が別のリストのサブセットであるとはどういう意味かを定義します。

> let xs `isSubsetOf` ys = all (`elem` ys) xs

次に、この関数を部分的に適用して、フィルタリングする適切な述語を取得できます。

> let xss = [[1,2,3],[23456,4,3,2],[1,3,4,5,6],[3,2,1],[4,2,1],[5,6,7],[1,2,5]]
> filter ([1, 2] `isSubsetOf`) xss
[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]

それは小さな入力のために行います。入力が大きい場合はData.Set、リストの代わりに使用することをお勧めします。

于 2012-11-07T14:27:55.427 に答える
3
ghci> import Data.Set hiding (filter)
ghci> let subset xs ys = fromList xs `isSubsetOf` fromList ys
ghci> let xs = [[1,2,3],[23456,4,3,2],[1,3,4,5,6],[3,2,1],[4,2,1],[5,6,7],[1,2,5]]
ghci> filter (subset [1,2]) xs
[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]
于 2012-11-07T14:26:22.380 に答える
2

したがって、リストcandidateのすべての要素が の要素でcriterionもある場合は、リストを保持する必要がありcandidateます。したがって、あなたのfilter状態は

condition candidate = all (`elem` candidate) criterion

これを使用して、次のflipように書くことができます

condition candidate = flip all criterion (flip elem candidate)

このように与える

filter (flip all criterion . flip elem)
于 2012-11-07T14:26:37.573 に答える