List 如何在Haskell中除去列表中列表的子列表?

List 如何在Haskell中除去列表中列表的子列表?,list,haskell,List,Haskell,我是Haskell的新手,想知道如何做到以下几点: L = [[1,2],[1,2,3],[1,2,3,4]] 如何去掉所有子列表([1,2],[1,2,3]),只得到[[1,2,3,4]的结果?如果我正确理解问题,解决方案如下: import Data.List -- Get only if element is not subsequence of any oth

我是Haskell的新手,想知道如何做到以下几点:

L = [[1,2],[1,2,3],[1,2,3,4]]

如何去掉所有子列表(
[1,2],[1,2,3]
),只得到
[[1,2,3,4]
的结果?

如果我正确理解问题,解决方案如下:

import Data.List                                                               

-- Get only if element is not subsequence of any other x element                                                                             
filterOutSublists x = filter (not . (isSub)) x                                 
  where
    -- Check if given element is subsequence of any of x element                                                                     
    isSub y = foldl (\acc y' -> acc || (y `elem` (init $ subsequences y'))) False x

但是这个解决方案的O(n)复杂度非常差,因此它对于长列表是无用的。

您可以使用
concat
来展平子列表,然后,由于您想消除重复项,您可以使用
Data.Set
将其转换为集合,然后再转换回列表-

导入符合条件的数据。设置为Set
f=(:[])。集合,托利斯。Set.fromList。海螺
输出
λ>f[[1,2],[1,2,3],[1,2,3,4]]
[[1,2,3,4]]
λ> f[[1,2],[3,4]]
[[1,2,3,4]]
请注意,最终的
(:[])
只是将最终结果放在一个周围的列表中,这就是您在示例中所展示的内容,尽管我甚至不知道这是什么意思


如果希望结果只是一个列表,而不是被另一个列表包围的列表,请删除
(:[])
组合。

数据中使用
isInfixOf
。list
我尝试了以下方法,第一个函数可以工作,但第二个函数会导致错误,我可能遗漏了一些明显的东西。子列表::[Int]->[Int]->Bool子列表a b=如果a b的发行顺序为False,则为False,否则为True FilterOutSubList::[[Int]]->[[Int]]FilterOutSubList(n1:n2:ns)=FilterSubList$n1 n2++FilterOutSubList(n2:ns)如果它们不是彼此的子列表,例如
L=[[1,2],[3,4]
?XY问题?也许首先不要生成这些短列表。如果您有更新,请回答您的问题,注释不是放置Haskell代码的好地方。