2013-03-14 107 views
2

的所有連續的子列表我有點新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],[],我試圖繼續,作爲xs傳遞[2,3,4],直到列表被耗盡。

有人可以給我一些指針嗎?或者我以完全錯誤的方式思考?

回答

4

您所擁有的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 

您可能想要刪除所有的空列表,這將是在結果集, ,因爲他們不是一個有趣的案件。

+0

感謝您的回答。我知道我想用尾巴作爲?但我並沒有真正得到'concat。地圖後綴。前綴「部分。我不完全確定如何正確編寫它。 – rlhh 2013-03-14 04:14:46

+0

@ user1043625我不確定你的意思。這就是你如何寫它。除非你想知道如何編寫列表函數。否則,它只是一個功能組合。 – sabauma 2013-03-14 04:24:52

+0

我相信我誤解了你答案的某些部分,但我相信我明白了。我實際上是以不同的方式來做這件事。 'listSuffix(xs)++ listPrefix(init xs)'。現在我需要找到一種方法來刪除空列表的重複。 – rlhh 2013-03-14 04:29:07

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