2017-02-06 5 views
1

Ich bin neu bei Haskell. Ich finde es schwierig, das folgende Subset-Programm mit Rekursion zu verstehen. Wie wird es bewertet?Haskell Rekursion Subsets

subset :: [a] -> [[a]] 
subset [] = [[]] 
subset (x:xs) = [zs | ys <- subset xs, zs <- [ys,(x:ys)]] 

Ausgang: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

Wenn ich auswerten manuell wie unten zusammenfassend wird

Manuelle Ausgabe: [],[3],[2],[1,2]

Ich vermisse einige Logik hier können Sie mir bitte helfen Verstehen Sie das obige Rekursionskonzept und welcher Teil von guard statement wird zuerst evaluiert?

+0

Nur ein Tipp: Um große Code-Chunks zu formatieren, markieren Sie sie und drücken Sie Strg + k. Nur. Verwenden Sie "' s für kleine Stücke. – Carcigenicate

+1

Bitte versuchen Sie auszudrücken, wie die letzte Zeile das Ergebnis in Englisch erstellt. Ich denke, das wird deutlich machen, wie es funktioniert. – Thilo

+0

Ich kann mir nicht helfen, auf dieses einzeilige Juwel hinzuweisen, das tut, was Sie wollen. Es verwendet 'filterM' von' Control.Monad'. 'subset = filterM (const [Falsch, Wahr])'. Und damit erhalten Sie dieselbe Ausgabe (wenn auch anders angeordnet) als "Teilmenge" - sie ist nicht weniger effizient! – Alec

Antwort

2

Die letzte Zeile besagt, dass der Satz von Teilmengen von x:xs die Menge von Teilmengen von xs zusammen mit x ist, die zu jedem dieser Sätze hinzugefügt wurde.

Eine andere Art, es auszudrücken ist, dass

zs <- [ys,(x:ys)] 

genau zwei Sätze erzeugt, und ysx:ys für jede ys die eine der Teilmengen von xs ist.