2016-11-18 9 views
0

Ich brauche eine Funktion, die eine Liste aller möglichen Unterlisten zurückgibt, ohne Elemente zu überspringen, z.B. Unterlisten [1,2,3,4] sollten [[1,2,3,4], [1,2,3] usw.) zurückgeben, aber die Liste sollte NICHT [1,2,4] enthalten. Meine aktuelle "Lösung" istErstellen einer Liste von Unterlisten einer gegebenen Liste

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

der folgende umfasst nicht [1,2,4]

Vielen Dank im Voraus

EDIT: Gefunden eine Lösung (mit einer wenig Hilfe von meinem Freund)

Sieht ein bisschen ungeschickt, aber es funktioniert

>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

Ich möchte es selbst implementieren und es scheint wie Schwänze zum Beispiel würde nicht zurückkehren [1,2], wenn gegeben [1,2,3] – Grapengeter

+0

Wenn Sie nicht wollten Sie es selbst als Übung implementieren, Sie würde nach "inits" (https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html#v:inits) aus "Data.List" suchen. (Ich habe "Schwanz" anstelle von "Inits" in meinem ursprünglichen Kommentar falsch geschrieben.) – duplode

+0

Inits kommt nicht zurück [2,3] wenn gegeben [1,2,3]. Kombination beider Skips [2,3] in [1,2,3,4] – Grapengeter

Antwort

2

Data.List enthält sowohl inits als auch tails. Was Sie wollen, ist das inits jedes Mitglied der Schwänze Liste (oder möglicherweise umgekehrt, aber später aus dem Grund, warum Runde auf diese Weise besser ist)

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],[]] 

Wenn Sie möchten, möchten Sie vielleicht loswerden alle null Listen:

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

Oder wenn Sie die Nulllisten in erster Linie zu vermeiden, bevorzugen zu erzeugen:

sublists = concatMap (tail . inits) . tails 

Das Ergebnis inits beginnt immer mit dem leeren Liste, während das Ergebnis von tails immer mit der leeren Liste endet. So ist tail . inits sicher, weil tail niemals auf eine leere Liste angewendet wird; Es gibt nur das Ergebnis ohne die führende leere Liste zurück. inits [] gibt einfach [[]] zurück, so dass die letzte leere Liste von tails gelöscht wird.

Verwandte Themen