2010-05-06 13 views
5

Ich möchte ein Diagramm, in Haskell in folgender Weise darstellen:Haskell Graph Datentyp Darstellung

Für jeden Knoten I Sein Wert und eine Liste der benachbarten Knoten gespeichert werden sollen. Das Problem, mit dem ich Schwierigkeiten habe, ist, dass die benachbarten Knoten als Referenzen zu anderen Knoten gespeichert werden sollen.

Zum Beispiel möchte ich Knoten ny als ("NY" (l p)) gespeichert werden, wobei l und p benachbarte Knoten sind, und nicht als ("NY" ("London" "Paris")).
Ich habe versucht, so etwas wie dieses:

data Node a = Node { value :: a 
        , neighbors :: [Node a] 
        }deriving (Show) 

let n1 = Node {value=1, neighbors=[n2]} 
let n2 = Node {value=1, neighbors=[n1 n3]} 
let n3 = Node {value=1, neighbors=[n2]} 

Aber ich en Fehler bekommen in Bst. Was mache ich falsch ?

+1

Sie wahrscheinlich mit 'verwendet lassen Sie sich an der Ghci-Eingabeaufforderung, aber es ist nicht auf der obersten Ebene in tatsächlichen Haskell-Programmen erforderlich. –

Antwort

7

Zwei Probleme:

  1. let ist eine Ausdrucksform und Top-Level bei den Compiler eine Erklärung Form erwartet.

  2. Sie benötigen ein einzelnes Nest der Bindungen; Mit drei let s haben Sie die Definitionen in drei separate Bereiche aufgeteilt.

Der folgende Code kompiliert, und wenn ich für n1 fragen, erhalte ich einen unendlichen Zeichenfolge Ausdruck wie erwartet:

module Letnest 
where 
data Node a = Node { value :: a 
        , neighbors :: [Node a] 
        } deriving (Show) 

n1 = Node {value=1, neighbors=[n2]} 
n2 = Node {value=1, neighbors=[n1, n3]} 
n3 = Node {value=1, neighbors=[n2]} 
+3

Beachten Sie, dass 'n1' und' n3' völlig ununterscheidbar sind (da sie dieselbe Definition haben), was je nach Ihrer Anwendung ein Problem mit dieser Darstellung sein kann. –

4

Ich würde nicht ein Diagramm auf diese Weise darstellen. Speichern Sie die Knoten in einer Map oder einem Array, und verweisen Sie mit ihren Schlüsseln auf sie, anstatt direkt auf sie zu zeigen. Dies wäre viel einfacher zu speichern, zu laden, zu warten und zu bearbeiten.

Für einige Probleme mit Ihrer aktuellen Darstellung:

Reid Barton kommentiert:

Beachten Sie, dass n1 und n3 vollständig nicht zu unterscheiden sind (da sie die gleiche Definition haben), die, je nach Anwendung, kann ein Problem mit dieser Darstellung sein.

(es gibt keinen is Vergleich a la Python in Haskell)

Norman Ramsey bemerkt:

ich einen unendlichen Zeichenfolge Ausdruck erhalte

+1

Ich würde nicht so eine Grafik wie diese darstellen, aber das ist, was meine Hausaufgaben sagt :) –

+0

@John Retallack: oh. Ich hoffe, dass die nächste Hausaufgabenfrage darin besteht, wie Sie sonst eine Grafik darstellen könnten. – yairchu

Verwandte Themen