Nein, das kannst du nicht. Warum? Da Muster Übereinstimmungswerte und ihre Unterabschnitte übereinstimmen, ist die "Mitte" einer Liste kein Unterabschnitt der Liste. Die Liste [1, 2, 3, 4]
ist in ihrer Struktur 1:(2:(3:(4:[])))
. Daher möchten Sie first
mit 1
und last
mit 4
übereinstimmen, die beide Teilbereiche der Liste sind und daher nicht disqualifiziert werden. Aber die middle
, die Sie wollen, wäre 2:(3:[])
, was kein Unterteil der Liste ist und daher keine Übereinstimmung sein kann.
Beachten Sie, dass wir auch kein Muster schreiben können, das gleichzeitig mit dem ersten und dem letzten Element einer Liste übereinstimmt. Ein Muster hat eine Tiefe, die bei der Kompilierung festgelegt ist.
Die Mustererkennung funktioniert für Konstruktoren, : ist der einzige Listenkonstruktor, sodass Sie in der Mitte der Liste nicht übereinstimmen können. Sie müssen die neue Liste rückwärts aufbauen (offensichtlich :)), was durch den Kopf und das Anhängen an die Rückseite des Rests der Liste geschehen kann.
Probieren Sie diesen Code:
%Vor% l
bringt Sie nicht zum letzten Element in einer Liste, sondern Sie erhalten den Rest der Liste neben den ersten beiden Variablen, denen die ersten zwei Elemente in einer Liste zugewiesen sind.
Wenn Sie eine Musterübereinstimmung für eine Liste schreiben, wird der ersten Variablen das erste Element zugewiesen usw., bis das Programm die letzte Variable erhält, in der alles, was noch übrig ist, zugewiesen wird. Es ist nichts besonderes, ein s
nach einem x
hinzuzufügen, eine Variable namens y
würde das Gleiche tun.
Wenn Sie das letzte Element einer Liste erhalten möchten, müssen Sie ein Muster erstellen, das (x:xs)
ähnelt, und die Rekursion für xs
verwenden und dieses Muster anwenden, bis Sie zu einem Listenelement kommen Letztes Element. Allerdings würde ich empfehlen, Adam Bergmarks Antwort zu lesen, um einen besseren Weg zu finden, eine Liste umzukehren, die nicht die Suche nach dem Ersten und dem Letzten beinhaltet Elemente einer Liste.
Tags und Links haskell recursion pattern-matching