Haskell-Muster, das dem ersten, mittleren Abschnitt und letzten entspricht

8

Ich wollte also eine einfache String-Reverse-Funktion in Haskell machen

%Vor%

Gibt es also eine Möglichkeit, eine Musterstruktur in haskell zu definieren, die first und last element und alle Elemente in middle ?

hat?     
nobody 21.03.2012, 21:10
quelle

4 Antworten

6

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.

    
Luis Casillas 21.03.2012, 22:04
quelle
5

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.

    
Adam Bergmark 21.03.2012 21:31
quelle
1

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.

    
user721010 21.03.2012 22:23
quelle
0

Eine funktionierende Version:

%Vor%

Beachten Sie, dass diese Implementierung leistungsmäßig ein Desaster ist. Implementierungen mit einer Falte und / oder Akkumulatoren sind viel effizienter.

    
Landei 22.03.2012 09:52
quelle