所以,要解释一下那个问题......
我正在尝试使用过滤器,而不是在任何地方。所以这就是我想要的行为。给出一个列表(Integer
s)即
[[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]]
答案 0 :(得分: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
而不是列表。
答案 1 :(得分: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]]
答案 2 :(得分: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)
答案 3 :(得分: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]]
==
Š
[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]