2

所以,要解释满嘴的问题……

我正在尝试使用过滤器,但没有得到任何地方。所以这就是我想要的行为。给定一个列表列表(Integers),即

[[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 回答
0
similars :: Eq a => [a] -> [[a]] -> [[a]]
similars xs  =  filter (\ ys -> all (`elem` ys) xs)

意义

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

==s

[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]
于 2017-02-15T06:37:06.207 回答