2016-05-09 17 views
1

Ich möchte eine Funktionen erstellen, die eine Liste und erstellt eine Liste der Liste mit Liste Verständnis mit dem Formular [[e1],[e1,e2],[e1,e2,e3]...].Haskell, Liste von Listen mit einer bestimmten Form (Liste Verständnis)

Zum Beispiel:

f5 ['a','b','c'] = ["a","ab","abc"] 
f5 [1,2,3] = [[1],[1,2],[1,2,3]] 

Mein Code:

f5 xs = [a | a <- xs] 

-- tests: 
*Main> f5 ["a","b","c"] 
["a","b","c"] 
*Main> f5 [1,2,3] 
[1,2,3] 
+1

Ihre zwei Eingänge haben nicht die gleiche Arten. Vielleicht meintest du '['a', 'b', 'c']' – karakfa

+0

Du hast Recht, ich werde es ändern! –

Antwort

2

Sie können es wie folgt tun:

f5 xs = [take index xs | (x, index) <- zip xs [1..]] 

Für jedes Element in der Liste ein Tupel erstellt wird, enthält das Element und sein Index, beginnend bei 1. Dann, mit take, für jedes Element in der gezippten Liste ein a Die Anzahl der Elemente aus der ursprünglichen Liste wird übernommen. Die Anzahl der Elemente ist im Index angegeben.

Eigentlich brauchen wir nicht einmal die x Element aus dem Tupel, so dass diese neu geschrieben werden könnte als

f5 xs = [take index xs | (_ ,index) <- zip xs [1..]] 
+2

Sie brauchen eigentlich nur die Länge, kann vereinfacht werden? zu 'f5 xs = [nimm i xs | i <- [1 .. (Länge xs)]] ' – karakfa

+1

@karakfa Danke. Wie finden Sie die ganze Zeit so gute Antworten? ;-) – Kapol

1

Dies funktioniert auch

foldr (\x rest -> [x]:(map (x:) rest)) [] [1,2,3,4] 
Verwandte Themen