Haskell (:) und (++) Unterschiede
Tut mir Leid für so eine Frage. Ich bin mir nicht sicher über den Unterschied des :
und ++
operator in Haskell.
x:y:[] = [x,y]
auch
[x] ++ [y] = [x,y]
als für die reverse-Funktion, die sich diese Frage für mich,
reverse ::[a]->[a]
reverse [] = []
reverse (x:xs) = reverse(xs)++[x]
Warum nicht für die folgenden arbeiten?
reversex ::[Int]->[Int]
reversex [] = []
reversex (x:xs) = reversex(xs):x:[]
geben eine Art Fehler.
InformationsquelleAutor der Frage DarthVader | 2009-11-30
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
:
Betreiber ist bekannt als der "cons" - operator und wird verwendet, um voran ein head-element einer Liste. So[]
ist eine Liste undx:[]
ist vorx
auf die leere Liste, so daß eine Liste[x]
. Wenn Sie dann Nachteiley:[x]
Sie am Ende mit der Liste[y, x]
das ist das gleiche wiey:x:[]
.Den
++
Betreiber ist die Liste operator die zwei Listen, die als Operanden und "kombinieren" Sie in einer einzigen Liste. Also, wenn Sie die Liste[x]
und die Liste[y]
dann können Sie verketten Sie wie folgt:[x]++[y]
zu bekommen[x, y
].Beachten Sie, dass
:
nimmt ein element und eine Liste während++
nimmt zwei Listen.Als für deinen code, der nicht funktioniert.
Die reverse-Funktion liefert eine Liste. Da die
:
operator ist nicht eine Liste als erstes argument dannreverse(xs):x
ist ungültig. Aberreverse(xs)++[x]
gültig ist.InformationsquelleAutor der Antwort Vincent Ramdhanie
: conses ein element auf einer Liste.
++ fügt zwei Listen.
Die erstere Art
in der Erwägung, dass die letztere Art
InformationsquelleAutor der Antwort Brian
Verkettung mit (++)
Vielleicht denke ich zu tief in dieses aber,
soweit ich das verstehe, wenn Sie versuchen, Sie zu verketten
Listen mit
(++)
zum Beispiel:(++)
Durchlaufen muss, die komplette linke Liste.Ein Blick auf die code (++) macht es
alle die mehr klar.
Somit wäre es wünschenswert, zu vermeiden, mit
(++)
da mit jedem Aufrufreverse(xs)++[x]
die Liste wird immer größer (oder kleiner, je nachdemauf den Standpunkt. Wie auch immer, das Programm einfach Durchlaufen muss, eine andere
Liste bei jedem Aufruf)
Beispiel:
Können sagen, ich implementieren Umgekehrt wie vorgeschlagen, durch Verkettung.
Umkehrung die Liste [1, 2, 3, 4] würde ähnlich Aussehen, wie diese:
Tail-Rekursion mit dem cons-operator (:)!!!
Einer Methode zum Umgang mit call-stacks wird durch das hinzufügen einer Akkumulator.
(es ist nicht immer möglich, fügen Sie einfach ein Akkumulator. Aber die meisten der
rekursive Funktionen, die man befasst sich mit sind primitiv rekursive und kann somit
umgewandelt werden tail-rekursive Funktionen.)
Mit der Hilfe des Akkumulators ist es möglich, um in diesem Beispiel
funktionieren, mit dem cons-operator
(:)
.Der Akkumulator --
ys
in meinem Beispiel -- sammelt sich das aktuelle Ergebnis und übergeben als parameter. Weil der Akku sind wir nun in der Lage,die Verwendung der Nachteile Betreiber ansammeln, das Ergebnis ist, indem der
Kopf unserer ersten Liste, jedes mal.
Es ist eine Sache hier zu beachten.
Den Akkumulator ist ein zusätzliches argument. Ich weiß nicht, ob Haskell
bietet Standard-Parameter, aber in diesem Fall wäre es schön,
weil Sie würde immer rufen Sie diese Funktion mit einer leeren Liste
als der Akku in etwa so:
reverse' [1, 2, 3, 4] []
Es gibt viel Literatur über die tail-Rekursion und ich bin
sicher, es gibt eine Menge ähnlicher Fragen auf
StackExchange /StackOverflow. Bitte korrigieren Sie mich, wenn Sie Fehler gefunden.
Freundlichen GRÜßEN,
BEARBEITEN 1:
Wird Ness wies darauf hin, dass einige links zu wirklich guten Antworten für diejenigen von Euch, die interessiert sind:
EDIT 2:
Ok.
Dank dFeuer und seine Korrekturen, ich glaube, ich verstehe, Haskell
ein kleines bisschen besser.
1.Die
$!
ist jenseits meines Verständnisses. In allen meinen tests schien es zumachen alles noch schlimmer.
2.Als dFeuer hingewiesen:
Der thunk repräsentieren Sie die Anwendung von
(:)
zux
undy
ist semantisch identisch zux:y
aber braucht mehr Speicher. So das ist das Besondere an den cons-operator(und faul-Konstruktoren), und es gibt keine Notwendigkeit, die Dinge zu erzwingen, die in irgendeiner Weise.
3.Wenn ich anstatt sumUp ganzen eine Liste mit einer ganz ähnlichen Funktion,
strengen Bewertung durch BangPatterns oder die
seq
Funktionwird verhindern, dass der stack wächst zu groß, wenn entsprechend verwendet. z.B.:
Beachten Sie die bang vor y. Ich versuchte es in ghci und es
braucht weniger Speicher.
InformationsquelleAutor der Antwort Nimi
cons
neigt dazu, einen Typ-Konstruktor als ein Betreiber. das Beispiel hier ist:
verwendet werden kannlet..in..
expresion aber++
ist nichtgibt 1 zurück, aber
einen Fehler zurück
Variable not in scope x
Machen Sie es einfach, denken
cons
wie diesehttps://en.wikibooks.org/wiki/Haskell/Other_data_structures
Darüber hinaus, wenn Sie umkehren möchten, ein array mit cons. Hier ist ein Beispiel, das wissen ist entnommen aus Prolog
InformationsquelleAutor der Antwort Clite Tailor