Haskell 包含列表元素的列表列表的筛选器元素

Haskell 包含列表元素的列表列表的筛选器元素,haskell,Haskell,所以,为了解释这一满嘴的问题 我试着使用过滤器,但却一事无成。这就是我想要的行为。给定一个列表列表(整数的列表),即 我想要另一个列表,即[1,2],并获取包含这两个元素的所有列表。(其他任何一个在此时此刻被保留下来都无关紧要,尽管以后可能需要这样做)。所以在这个例子中,我的输出类似于 [[1,2],[2,1],[2,1],[1,2]] 或者最好 [[1,2,3],[3,2,1],[4,2,1],[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]]

因此,如果列表中的所有元素
条件
也是
候选项
的元素,那么您希望保留一个列表
候选项
。因此,您的
过滤器
条件为

condition candidate = all (`elem` candidate) criterion
使用
flip
我们可以编写为

condition candidate = flip all criterion (flip elem candidate)
因此给予

filter (flip all criterion . flip elem)

首先,定义一个列表的元素作为另一个列表的子集的含义:

> 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
而不是列表

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]]

作为
过滤器(isSubsetOf(fromList[1,2]).fromList)
,这将更有效,以避免在每次
子集调用时将
[1,2]
列表转换为集合。(对于如此短的列表,这无疑是一个小开销。)谢谢,
flip
到底做了什么?
flip
改变了参数的顺序,
flip fx y=fy x
。您也可以将筛选器编写为
filter((`all`criteria).flip elem)
,但是
condition`all`list
对我来说似乎很奇怪。好吧,我们为什么不更改顺序呢?基本上,我明白了,我们正在获取标准的所有元素,并询问它们是否是我们正在过滤的元素。为什么翻盖能起作用?我不太明白
all
elem
按定义的顺序获取参数,但对于筛选条件,我们没有按要求的顺序接收参数,因此我们必须创建执行相同操作但按其他顺序获取参数的函数,因此,
flip all
flip elem
。我可能希望保留顺序,因此我必须坚持使用列表而不是集合:S
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]]
[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]