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