3

我对 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 传递,直到列表用完为止。

有人可以给我一些指示吗?还是我的想法完全错误?

4

2 回答 2

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

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

于 2013-03-14T02:03:27.590 回答
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
于 2017-04-11T12:51:39.347 回答