Ich spiele derzeit mit LISP (insbesondere Scheme und Clojure) und frage mich, wie typische Datenstrukturen in funktionalen Programmiersprachen behandelt werden.
Angenommen, ich möchte ein Problem mithilfe eines Algorithmus zur Pfadfindung für Diagramme lösen. Wie würde man diesen Graphen normalerweise in einer funktionalen Programmiersprache darstellen (hauptsächlich interessiert an einem reinen funktionalen Stil, der auf LISP angewendet werden kann)? Würde ich die Grafiken einfach ganz vergessen und das Problem auf andere Weise lösen?
Funktionale Sprachen behandeln Datenstrukturen genauso wie nicht funktionale Sprachen: indem sie die Schnittstelle von der Implementierung trennen und abstrakte Datentypen erstellen.
Sie können abstrakte Datentypen in Lisp erstellen. Für ein Diagramm möchten Sie möglicherweise einige Funktionen:
Sobald Sie diese Schnittstelle zu einem Diagramm erstellt haben, können Sie die tatsächlichen Datenstrukturen auf viele verschiedene Arten implementieren und möglicherweise Faktoren wie Programmierereffizienz, Flexibilität und Recheneffizienz optimieren.
Der Schlüssel besteht darin, sicherzustellen, dass der Code, der Diagramme verwendet, nur die Diagrammschnittstelle verwendet und nicht auf die zugrunde liegende Implementierung zugreift. Dadurch wird der Client-Code einfacher, da er von der tatsächlichen Implementierung entkoppelt ist.
quelle
Nun, es würde davon abhängen, ob Ihr Diagramm gerichtet / ungerichtet, gewichtet / ungewichtet ist, aber eine Möglichkeit, ein gerichtetes, gewichtetes Diagramm darzustellen (was am allgemeinsten wäre), ist eine Karte mit Karten (in Clojure).
würde eine Karte mit Knoten darstellen: a: b und: c. : a zeigt auf: b mit einem Gewicht von 3 und: c mit einem Gewicht von 4 .: b zeigt auf: a mit einem Gewicht von 1 .: c zeigt auf nichts.
quelle
Wenn ich in Common Lisp einen Baum darstellen müsste, würde ich entweder eine Liste verwenden (wenn es nur für einen schnellen Hack wäre) oder eine Baumklasse definieren (oder eine Struktur, aber Klassen interagieren gut mit generischen Funktionen, warum also nicht)? .
Wenn ich Literalbäume im Code benötige, würde ich wahrscheinlich auch eine
make-tree
Funktion definieren , die eine Listendarstellung des gewünschten Baums verwendet und ihn in einen Baum von Baumobjekten verwandelt.quelle
In Haskell ist die Liste die grundlegende Datenstruktur. Wenn Sie erweiterte Datenstrukturen wünschen, verwenden Sie häufig rekursive Strukturen, z. B. ist ein Baum entweder null oder ein Knoten und zwei Bäume
quelle