Frage

Ich lerne Haskell von einem Java-Hintergrund. Wenn ich Java programmieren, ich fühle mich wie ich ein gutes Verständnis davon, wie Objekte im Speicher angelegt sind und die Folgen davon. Zum Beispiel weiß ich genau, wie java.lang.String und java.util.LinkedList Arbeit und daher weiß ich, wie ich sie verwenden. Mit Haskell bin ich ein wenig verloren. Zum Beispiel, wie funktioniert (:) Arbeit? Kümmert mich das? Ist es angegeben irgendwo?

War es hilfreich?

Lösung

Die kurze Antwort ist nein. Wenn in Haskell Programmierung sollten Sie denken Sie an Ihre Datenstrukturen als reine mathematische Objekte und sich keine Sorgen darüber, wie sie im Speicher dargestellt sind. Der Grund dafür ist, dass in der Abwesenheit von Nebenwirkungen, gibt es wirklich nichts Daten mit Ausnahme der Funktionen, die es schaffen und den Funktionen, die Sie die einfacheren Teile verwenden können, zu extrahieren, aus denen wurde es gebaut .

Um Informationen über Daten Konstrukteuren wie (:) zu sehen oder andere Begriffe verwenden Sie das :type (oder nur :t kurz) Befehl in GHCi:

:Prelude> :type (:)
(:) :: a -> [a] -> [a]

Das sagt man, dass der (:) Konstruktor (sprich: „cons“), einen Wert von jeder Art nimmt, und eine Liste der gleichen Art, und gibt eine Liste von der gleichen Art. Sie können auch ein bisschen mehr Informationen unter Verwendung des :info Befehl erhalten. Dies zeigt Ihnen, was die Datendefinition sieht aus wie:

Prelude> :info (:)
data [] a = ... | a : [a]   -- Defined in GHC.Types
infixr 5 :

Das sagt Ihnen, dass (:) der Konstruktor ist, die ein Element zu einer bestehenden Liste prepends.

ich auch sehr empfehlen Hoogle nicht nur für die Dinge beim Namen suchen, aber für die umgekehrte Art tun die Suche; wo kennen Sie die Signatur der Funktion, die Sie suchen und finden wollen, wenn jemand es bereits für Sie geschrieben. Hoogle ist schön, weil es Beschreibungen und Beispiele für den Gebrauch gibt.

Formen von induktiven Daten

ich oben gesagt, dass es nicht wichtig ist, die Darstellung Ihrer Daten im Speicher zu wissen ... Sie sollten jedoch verstehen, die Form der Daten, die Sie zu tun haben, eine schlechte Leistung zu vermeiden Entscheidungen. Alle Daten werden in Haskell ist induktiv definiert, dh es ist eine baumartige Form hat, die rekursiv immer nach außen entfaltet. Sie können bei der Definition, indem man der Form von Daten sagen; es gibt wirklich nichts über die Performance-Eigenschaften verborgen, wenn Sie wissen, wie diese zu lesen:

data MyList a = Nil | Cons a (MyList a)

Wie Sie aus der Definition sehen kann, ist die einzige Möglichkeit, eine neue MyList bekommen kann, ist durch den Cons Konstruktor. Wenn Sie diesen Konstruktor mehrmals verwenden, werden Sie am Ende mit etwas grob dieser Form:

(Cons a5 (Cons a4 (Cons a3 (Cons a2 (Cons a1 Nil)))))

Es ist nur ein Baum ohne Zweige, das ist die Definition einer Liste! Und der einzige Weg, um a1 zu erhalten ist, die von jedem der Conss wiederum Abspringen; damit Zugriff auf das letzte Element ist O (n) , während Zugang zum Kopf konstant Zeit. Sobald Sie diese Art der Argumentation über Datenstrukturen auf der Grundlage ihrer Definitionen tun können, sind Sie ganz eingestellt.

Andere Tipps

Kurze Antwort „nein“ lautet, nicht wahr über Datenlayouts müssen wissen, -. Die Kenntnis der Komplexität nützlich obwohl sein

Um hoch optimierten Haskell Programme zu schreiben, um ein funktionstüchtiges Kenntnis der Form von Datenstrukturen in dem Heap ist wichtig, aber. Ein Werkzeug, das zu helfen, ist „Vakuum“ , die Diagramme von Datenstrukturen Haskell rendern wie sie angelegt.

Einige Beispiele:

$ view "hello"

verkettete Listen

$ view (IntMap.fromList $ zip [1..10] [1..])

Data.IntMap

Hier ist ein kurzes Video, wie das Tool zu verwenden: http: // www. youtube.com/watch?v=X4-212uMgy8

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top