Kann jemand Zeilen für Zeile kommentieren?
Ist das [A] ein generisches wie in c #, das wir tun würden?
h scheint nicht definiert zu sein?
Ich denke, der Hauptteil des Algo ist der rekursive Aufruf:
%Vor%Es scheint keinen Scheck für 2 Gegenstände in der Liste zu geben und dann den ersten Gegenstand zu nehmen, um den vorletzten zu bekommen, verwirrt!
Die Schlüssel zum Verständnis der Musterübereinstimmung sind zu erkennen, dass x :: y
wird nur einer Liste mit einem einzelnen Objekt x
gefolgt von dem Rest der Liste y
(was sein könnte nur Nil
, oder könnte viele Elemente enthalten), und _
bedeutet "hier muss etwas sein, aber wir werden es nicht stören, es zu benennen". (Und dass die Übereinstimmungen der Reihe nach und die Listen mit Nil
enden.)
Sie haben Recht, dass [A]
ein generischer Typ ist.
Also, die erste Zeile:
%Vor% sagt, wenn unsere Liste (konzeptionell) Node(h) -> Node(whatever) -> Nil
aussieht, dann geben wir h
zurück. Dies ist genau eine Zwei-Elemente-Liste mit dem ersten ausgewählten Element. Beachten Sie, dass Nil
nicht mit einem beliebigen Ende der Liste übereinstimmt. Es entspricht nur dem Ende des Listeneintrags Nil
. Dies liegt an einer Regel, die Scala zur Unterscheidung der beiden verwendet: Kleinbuchstaben werden als Platzhalter behandelt, die den entsprechenden Wert enthalten sollen, während Großbuchstaben als übereinstimmende Konstanten behandelt werden. (Wenn Sie einen Kleinbuchstabennamen eingeben müssen, können Sie ihn mit Backticks umgeben.)
Okay, nehmen wir jetzt an, es ist keine Liste mit zwei Elementen. Wenn es nicht leer ist, stimmt es mit
überein %Vor%Wenn wir also keine Liste mit zwei Elementen haben, werfen wir den ersten Gegenstand weg und versuchen es erneut. Schließlich, wenn wir irgendwie nie mit einer Zwei-Elemente-Liste enden würden, kommen wir zu
%Vor% und wir sind fertig. (Dies könnte auch case Nil
sein, da dies die einzige Möglichkeit ist, die nicht mit den beiden anderen Einträgen übereinstimmt.)
A
ist eine Typvariable, dh die Funktion wird generisch für jeden Typ A
definiert.
h
ist durch den Mustervergleich gebunden: Die ersten case
-Zustände, wenn es genau zwei Elemente gibt, dann rufen Sie das erste h
auf und geben es zurück.
Es scheint keine Überprüfung für zwei Einträge in der Liste zu geben
Es gibt: h :: _ :: Nil
bedeutet "ein Element h
, gefolgt von einem Element, gefolgt von keinen weiteren Elementen." Nil
ist kein Element, es ist das Ende der Liste.
und dann den ersten Punkt nehmen, um den vorletzten
zu erhalten
Wenn Sie das erste einer Liste mit zwei Elementen verwenden , nehmen Sie den vorletzten Eintrag. Wenn die Liste weniger oder mehr Elemente als zwei enthält, gelten die anderen beiden Fälle.
larsmans und Rex haben deine Fragen behandelt, aber siehe Kapitel 9 für weitere Details zu '::' Ссылка
Die erste Zeile bedeutet, dass jedes Listenelement h zurückgegeben wird, wenn auf h ein weiterer und ein Nil-Zeiger (am Ende der Liste) folgt. Das tatsächliche Element, das auf h folgt, ist nicht wichtig, deshalb verwenden Sie _, um anzugeben, dass ein Element vorhanden ist, aber Sie interessieren sich nicht für seinen Wert.
Wenn der erste Fall nicht übereinstimmt, wird im zweiten Fall die Rekursion aufgerufen, wenn die Liste ein Kopfelement und einen Schwanz von mindestens einem Element enthält.
Schließlich retten Sie Listen, die nur aus einem einzigen Element bestehen. Auch hier müssen Sie sich nicht um den tatsächlichen Wert des Elementwertes kümmern.
Tags und Links scala list functional-programming recursion pattern-matching