2016-11-18 9 views
0

要素をスキップすることなく、すべてのサブリストのリストを返す関数が必要です。サブリスト[1,2,3,4]は[[1,2,3,4]、[1,2,3]など]を返しますが、リストには[1,2,4]は含まないようにしてください。 (私の友人の少しの助けを借りて)解決策が見つかりました与えられたリストのサブリストのリストを作成します。

: 私の現在の "溶液" は、事前に[1,2,4]

おかげ

EDITを含んでいます

>sublists :: [Integer] -> [[Integer]] 
>sublists [] = [[]] 
>sublists (x:xs) = [x:ys | ys <- sublists xs] ++ sublists xs 

です

ビット不器用に見えますが、それは

>sublists :: [Integer] -> [[Integer]] 
>sublists [] = [[]] 
>sublists (x:xs) = subs [] (x:xs) ++ sublists xs 
> where 
>  subs :: [Integer] -> [Integer] -> [[Integer]] 
>  subs xs [] = [xs] 
>  subs xs (a:as) = (xs ++ [a]) : (subs (xs ++ [a]) as) 
+0

私はそれを自分自身で実装したいと思っています。たとえば、[1,2,3]と指定された場合、tailsは返されません。 – Grapengeter

+0

あなたは自分自身を演習として実装したい場合は、 'Data.List'から[' inits'](https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html#v:inits)を探していました。 (元のコメントに 'inits 'の代わりに' tails'を書いてしまいました) – duplode

+0

initsは[1,2,3]が与えられても[2,3]を返しません。 [1,2,3,4] – Grapengeter

答えて

2

の作品にはinitstailsの両方が含まれています。何が欲しいのは、あなたが希望する場合、あなたが取り除くしたい場合があります尾リストの各メンバーののINITである(おそらくまたはその逆が、この方法でラウンドが優れている理由のために、後で参照)

sublists = concatMap inits . tails 

> sublists [1,2,3,4] 
[[],[1],[1,2],[1,2,3],[1,2,3,4],[],[2],[2,3],[2,3,4],[],[3],[3,4],[],[4],[]] 

sublists = filter (not . null) . concatMap inits . tails 

それとも、最初の場所でヌルリストの発生を回避することを好む場合:

sublists = concatMap (tail . inits) . tails 

initsの結果は常に空で始まるすべてのNULLリストリストは、tailsの結果は常に空のリストで終了します。したがって、tailは空のリストには適用されないため、tail . initsは安全です。先行する空のリストなしで結果を返します。 inits [][[]]を返すだけなので、tailsの最後の空のリストは削除されます。

関連する問題