Haskell Muster wiederverwenden

9

Im folgenden Code wird dieselbe Musterübereinstimmung (Knoten n links rechts) von drei verschiedenen Funktionen verwendet. Wenn ich ein Muster hinzufügen möchte, z. (Knoten n (Blatt) (Blatt)) oder ändere meinen Datentyp, ich muss alle Funktionen ändern. Gibt es eine Möglichkeit, diese Muster wiederzuverwenden, so dass ich sie nur einmal definieren muss?

%Vor%

Ich habe es versucht

%Vor%

aber ich kann das Muster _ nicht verwenden, und ich kann n , links und rechts nicht extrahieren es.

    
Emiel Steerneman 03.07.2015, 22:20
quelle

1 Antwort

4

Dies beantwortet nur den Teil:

  

Wenn ich meinen [...] Datentyp ändern möchte, muss ich alle Funktionen ändern.

In diesem Fall können Sie vermeiden, alle Funktionen um zu ändern Definieren eines benutzerdefinierten Musters mit der Erweiterung für Muster-Synonyme :

%Vor%

Oben habe ich den alten Konstruktor Node in NewNode umbenannt und auch die Reihenfolge seiner Argumente geändert. Dann habe ich ein pattern Node als eine Kompatibilitätsbrücke definiert, wodurch die alten Muster darunter noch einmal funktionieren.

Die Frage fragt auch:

  

Gibt es eine Möglichkeit, diese Muster wiederzuverwenden, so dass ich sie nur einmal definieren muss?

@PyRulez kommentiert die Verwendung von Platzhaltern für Datensätze, um Muster zu verkürzen. Hier ist ein möglicher Weg:

%Vor%

In diesem speziellen Fall gibt es keinen großen Platzgewinn. Unabhängig davon, wie groß das Muster ist, müssen wir nach der Datensatzdefinition (und der Hilfsfunktion) nur toR -> RNode{...} schreiben.

Ich bin mir nicht sicher, ob mir das wirklich gefällt.

Erstens beschmutzt der Datensatz den globalen Namensraum mit drei (partiellen!) Funktionen left :: R -> Tree, n :: R -> Int, right :: R -> Tree . Dies wird einige Warnungen auslösen, wenn Sie versuchen, z. n als Argument einer anderen nicht verwandten Funktion ( The local name shadows the global name n ).

Zweitens bringt die Erweiterung für Platzhalter für Datensätze einige Variablen mit, die nicht in den Code geschrieben sind - der Leser muss wissen (oder erraten), was diese Variablen sind. Beachten Sie auch, dass das RNode{..} -Muster z. n in Geltungsbereich mit einem anderen Typ als der globale Name: Int und nicht R -> Int . Ein Leser könnte denken, dass n der globale ist und sogar auf der Typ-Ebene irregeführt wird.

Drittens verwendet der obige Code Ansichtsmuster, und diese verwirren derzeit die Vollständigkeitsprüfung:

%Vor%

In diesem speziellen Fall könnten wir einfach

schreiben %Vor%

um die Warnung zu vermeiden, aber im Allgemeinen haben wir diese Option nicht immer.

    
chi 03.07.2015, 22:30
quelle

Tags und Links