Syntax für die Liste der Bau - / Verkettung
Ich habe nur bei Haskell jetzt seit zwei Tagen, und Frage mich, was der Unterschied zwischen den beiden Funktionsdefinitionen unten sind:
Prelude> let swap (x1:x2:xs) = x2:x1:xs
Prelude> swap [1..5]
[2,1,3,4,5]
Prelude> let swap' (x1:x2:xs) = [x2] ++ [x1] ++ xs
Prelude> swap' [1..5]
[2,1,3,4,5]
Ist, was macht x2:x1:xs unterscheidet sich von [x2] ++ [x1] ++ xs ?
Bitte und danke.
Was meinst du anders? Ihre denotations sind die gleichen, also, die swap-und swap' das gleiche tun.
InformationsquelleAutor Colin Woodbury | 2011-04-13
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Typ-Signaturen sind ein guter Ort, um zu starten:
Finden Sie diese mit
:type (:)
und:type (++)
im ghci.Wie Sie sehen können von dem Typ von Signaturen, die beide verwendet werden zum erzeugen von Listen.
Den
:
operator wird verwendet um Listen zu konstruieren (und Sie auseinander zu nehmen, wieder "pattern-matching"). Machen Sie eine Liste[1,2,3]
Sie bauen es mit1 : 2 : 3 : []
. Das erste element der:
ist der Eintrag auf der Vorderseite der Liste, und das zweite element ist entweder eine Liste (auch mit:
oder die leere Liste dargestellt durch[]
).Den
++
Betreiber ist die Liste Verkettung. Es dauert zwei Listen und fügt Sie zusammen.[1,2,3] ++ [4,5,6]
legal ist, in der Erwägung, dass1 ++ [1,2,3]
nicht.In der Spitze werden Sie die Erstellung der Liste durch die ersten zwei Elemente vertauscht und die gleiche Schwanz. In die zweite, die Sie die Liste erstellen, indem Sie die ersten beiden auseinander, dann bauen Sie Sie in Listen und verketten Sie Sie mit dem Schwanz. Ich denke, dass die erste wäre eine effizientere, aber ich glaube nicht, dass ist das wichtigste. Die erste ist mehr idiomatische Haskell meiner Meinung nach, also, warum sollten Sie es wählen.
Danke! Nach den Erklärungen hier, und mehr, die heute studieren, ist es alles macht mehr Sinn.
InformationsquelleAutor Jeff Foster
Dies hat nichts zu tun mit der syntax. (:) und (++) sind nur verschiedene Operatoren. (:) ist ein Konstruktor, erstellt eine Liste aus einem element und einer weiteren Liste. (++) macht eine neue Liste, die die Verkettung der beiden Listen. Wegen (++) ist kein Konstruktor können Sie es nicht verwenden in den mustern.
Kommen wir nun zur Syntax: die Schreibweise
die Sie verwenden, ist eine Kurzform für
So, was Sie wirklich getan haben, in das zweite Beispiel ist:
Daher, bei der Erstellung einer Liste können Sie nicht vermeiden (:), es ist ultimatively der einzige Weg, es zu tun. Beachten Sie, dass müssen Sie konstruieren intermediate Listen nutzen zu können (++).
InformationsquelleAutor Ingo