2016-08-02 14 views
-7

Darstellen habe ich eine Liste wie folgt:einen Graphen als zwei Listen in Haskell

[(1,1.0,0.0),(2,2.0,0.0),(3,2.0,1.0),(4,3.0,0.0),(5,3.0,1.0),(14,3.0,2.0),(6,4.0,0.0),(7,4.0,1.0),(13,4.0,2.0),(8,5.0,0.0),(9,5.0,1.0),(10,6.0,0.0),(11,6.0,1.0),(12,7.0,0.0)] 

wobei das erste Element eine Knoten-ID ist, eine zweite ist x - und die dritte ein y -Koordinate.

Eine zweite Liste stellt

[(1,[2,3]),(2,[4,5]),(3,[14]),(4,[6]),(5,[7]),(14,[6,7,13]),(6,[8]),(7,[9]),(13,[]),(8,[10]),(9,[11]),(10,[12]),(11,[12]),(12,[13])]` 

die erste Element die ID dieses Knotens ist, und die zugehörige Liste enthält Nachfolger jedes Knotens.

Ich möchte, um eine Funktion schreiben, die eine Knoten-ID übernimmt, gibt die entsprechenden x, y sowohl den Knoten selbst und seine Nachfolger. Zum Beispiel: Der Knoten 1 Ausbeute

[(1.0,0.0,2.0,0.0), (1.0,0.0,2.0,1.0)]

weil der Knoten 1 Nachfolger hat 2 (2.0,0.0) und 3 (2.0,1.0)

EDIT:

ich schrieb Funktionen:

pairs [] = [] 
pairs ((nodeId,nodesucc):xs) = map (nodeId,) nodesucc : pairs xs 

pairsConcat = concat $ pairs $ edg graph2 

so jetzt zweite Liste wie folgt aussieht:

[(1,2),(1,3),(2,4),(2,5),(3,14),(4,6),(5,7),(14,6),(14,7),(14,13),(6,8),(7,9),(8,10),(9,11),(10,12),(11,12),(12,13)] 

Wie Tupel mit 4 Elementen zu erstellen?

+6

was haben Sie versucht. – levi

+0

Ich habe keine Ahnung, wie es geht – aabbcc

+0

Warum willst du es tun? – Gurkenglas

Antwort

1

Ich schließe ich den Kommentar oben, dass Sie sollten versuchen, mehr zu lesen, aber für den Fall, ein Beispiel dafür, wie dieses Problem noch gelöst werden könnte wäre nützlich:

Diese nicht direkt auf Ihr Problem bezieht, sondern in General ich würde beginnen, indem darauf hindeutet, dass Sie einen newtype für Ihr Knoten-IDs und Positionen verwenden:

newtype Id = ID Int deriving (Eq, Ord) 
data Point = Point Int Int 

ich auch ein Data.Map vorschlagen würde, mit diesen Daten zu speichern, statt einer Zuordnungsliste:

neighbors :: Map Id [Id] 
points :: Map Id Point 

Dann ist dies eine einfache Lösung, die dies zerlegt in (1) die benachbarten Punkte zu erhalten und (2) diesen Punkt zu allen hinzuzufügen. Dies verwendet die Maybe Monad, um Dinge zu komponieren, die möglicherweise sehr scheitern und sauber: