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 。現在、特定のリストのすべてのプレフィックスを一覧表示できるという点で、正しい方向に進んでいます。

あなたが聞きたいのは「リストのサブリストとは何ですか?」です。1つの答えは、それがリストのプレフィックスのサフィックスであるということです(つまり、リストの最後から一部を切り取り、次にそのリストの前からいくつかの要素を切り取ります。これにより、連続するサブリストの1つができます)。

したがって、があれば、必要なprefixesのは、指定されたプレフィックス(つまり、いくつかのリスト)のすべてのサフィックスを生成する方法です。だから、あなたが持っているなら

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

対応する関数も必要ですsuffixes

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

何に使うかはあなたにお任せします???。これらの2つの関数を使用すると、すべてのプレフィックスを取得し、すべてのサフィックスを生成して、隣接するすべてのサブリストを取得できます。

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 に答える