我是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传递,直到列表用完为止。
有人可以给我一些指示吗?还是我以完全错误的方式思考?
答案 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