2016-04-05 3 views
1

Ich habe diese Liste vom Typ ([(Double,Double)],[(Double,Double)]). example list = ([(1.0,1.0), (2.0,1.0), (1.0,1.0), (1.0,3.0)],[(1.0,4.0), (1.0,5.0), (1.0,1.0), (1.0,2.0), (1.0,3.0), (1.0,4.0), (1.0,5.0)])Listenbetrieb in Haskell

Wie würde ich nach dem vierten Tupel (1.0, 3.0) auf alle Daten zugreifen. Ich habe die Tail-Funktion bereits ausprobiert, scheint aber nicht zu funktionieren. Vielen Dank.

+0

Ich gehe davon aus, den Wert der Typ Korrekt und deine Typdeklaration ist nicht - daher habe ich den Typ – epsilonhalbe

+0

angepasst Könntest du bitte ausarbeiten, was du damit meinst? Könnten Sie auch die erwartete Eingabe/Ausgabe einer solchen Funktion anzeigen? – epsilonhalbe

+0

Ist das Problem, immer auf alle Daten nach dem vierten Tupel zuzugreifen, unabhängig davon, wie viele Tupel in der ersten Liste des äußeren Tupels sind? Oder geht es darum, alle Daten in der zweiten Liste des äußeren Tupels zu bekommen? – dvaergiller

Antwort

1

Es ist keine Liste, sondern ein Tupel von Listen. In der Tat, ein Tupel von Listen von Tupeln.

Um den zweiten Teil eines Tupels zu erhalten, verwenden Sie den snd Befehl:

snd ([(1.0,1.0), (2.0,1.0), (1.0,1.0), (1.0,3.0)],[(1.0,4.0), (1.0,5.0), (1.0,1.0), (1.0,2.0), (1.0,3.0), (1.0,4.0), (1.0,5.0)]) 

Dies ergibt:

[(1.0,4.0),(1.0,5.0),(1.0,1.0),(1.0,2.0),(1.0,3.0),(1.0,4.0),(1.0,5.0)] 

Von hier aus können Sie die Teile der zweiten Liste erhalten weiterhin mit tail oder !! Operator.

Der Vollständigkeit halber kann der erste Teil eines Tupels mit dem Befehl fst abgerufen werden.

4

Nun, zum einen, Ihre Liste ist keine Liste, sondern ein Tupel :)

type MyData = (MyList, MyList) 
type MyList = [MyListElem] 
type MyListElem = (Double, Double) 

Nun ist die zweite Liste Zugriff auf einfach snd.

snd :: (a,b) -> b 

So in Ihrem Fall:

snd :: MyData -> MyList 

Alternativ mit Lens Sie eine Linse auf, die direkt verwenden können:

list ^. _2 
+0

danke für die Hilfe –