生成列表的所有连续子列表

时间:2013-03-14 01:44:49

标签: list haskell sublist

我是Haskell的新手,我正在尝试生成列表中所有连续的子列表。

我目前有以下内容:

listSublists :: [a] -> [[a]]
listSublists []     = [[]]
listSublists xs     = [xs] ++ listSublists (init xs) 

我知道上面的函数会生成最后一个元素被移除的子列表,但我不知道如何完成我的伪代码。

我的伪代码基本上是

  

取整个完整列表,删除尾部。将(x:xs)的xs传递给   listSublists

例如,xs = [1,2,3] [xs] ++ listSublists(init xs)将生成[1,2,3,4],[1,2,3],[1,2],[1],[]并且我试图继续将[2,3,4]作为xs传递,直到列表用完为止。

有人可以给我一些指示吗?还是我以完全错误的方式思考?

2 个答案:

答案 0 :(得分:5)

您拥有的listSublists功能在功能上几乎相同 inits 功能。你走在正确的轨道上,因为你现在可以列出所有的 给定列表的前缀。

您想问的是“什么是列表的子列表?”一个答案是它 是列表前缀的后缀(即从中删除某些部分的后缀) 列表的结尾,然后切掉该列表前面的一些元素,并且 你有一个连续的子列表。)

所以,如果你有prefixes,那么你想要的是一种生成全部的方法 给定前缀的后缀(即某些列表的后缀)。所以,如果你有

prefixes :: [a] -> [[a]]
prefixes []     = [[]]
prefixes xs     = [xs] ++ prefixes (init xs) 

您还需要相应的函数suffixes

suffixes :: [a] -> [[a]]
suffixes []     = [[]]
suffixes xs     = [xs] ++ suffixes (??? xs) 

我会留给你弄清楚???的用途。有了这两个 函数,然后你只需要获取所有前缀,并生成所有后缀 获取所有连续的子列表

allSublists :: [a] -> [[a]]
allSublists = concat . map suffixes . prefixes

您可能想要删除结果集中的所有空列表, 因为它们不是一个有趣的案例。

答案 1 :(得分:0)

所有子列表(不一定是连续的):

sublists [] = [[]]
sublists (x:xs) = [x:sublist | sublist <- sublists xs] ++ sublists xs

只有连续的子列表:

nub $ concat $ map tails $ inits ls

(:) [] $ filter (\x -> length x /= 0) $ concat $ map tails $ inits ls