Implementieren eines benutzerdefinierten Vergleichs mit CustomComparison und CustomEquality in F # tuple

8

Ich bin hier, um ein bestimmtes Thema zu stellen - ich habe wirklich einige Informationen darüber im Internet gefunden. Ich implementiere eine F # Version des Minimax-Algorithmus. Das Problem, das ich jetzt habe, ist, dass ich Blatt meines Baumes vergleichen möchte (Datenstruktur unten). Auf der Suche nach den Fehlern, die der VS mir gab, kam ich zu etwas wie diesem:

Der Baumtyp, den ich früher hatte:

%Vor%

und der Versuch, IComparable zu implementieren

%Vor%

Am Ende will ich nur die max (und die min) einer Liste von LeafP durch seinen statischen Wert (in anderer Funktion berechnen).

Der obige Code wird kompiliert. Allerdings mit diesem Test:

%Vor%

Ich habe eine System.StackOverflowException in der Zeile "|:? TreeOfPosition as y - & gt; compare (x) (y)" in der Überschreibung von GetHashCode erhalten.

Ich habe einen Thread in der hubfs.net ( Ссылка ), mit dem ich über meinen Minimax diskutiere . Hier finden Sie meinen neuesten Code ( Ссылка )

Vielen Dank im Voraus,

Pedro Dusso

Nun, ich habe die Idee sehr klar verstanden, aber ich kann es nicht funktionieren lassen. Wenn ich daran denke, dass ich das Blatt mit dem maximalen statischen Wert aus einer Liste von Blättern ("List.max": P) bekommen möchte, denke ich, dass die Implementierung von CompareTo oder Equals die List.max an ihnen arbeiten lassen wird ? Ich komponiere die Dinge so:

%Vor%

Die Probleme, die ich habe, um die Funktionen auf diese Weise zu arrangieren, sind:

1) Der Musterdiskriminator 'LeafP' ist nicht definiert (mit LeafP rot unterstrichen)

2) (77,39): Fehler FS0039: Der Wert oder Konstruktor 'mycompare' ist nicht definiert, wenn ich versuche, eine ALT-EINGABE-Meldung in meinem F # Interactive erscheinen zu lassen. Die Position {77,39} entspricht dem Beginn meines Vergleichs (in GetHashCode).

Was mache ich falsch? Was kann ich besser machen?

Vielen Dank,

Pedro Dusso

EDIT 3 - Gelöst

Ja! Ich verwalte deine Antwort, um endlich zu arbeiten!

Der endgültige Code ist hier:

%Vor%

Danke für die Rückmeldung!

Pedro Dusso

    
Pedro Dusso 22.06.2010, 13:14
quelle

1 Antwort

6

Zunächst erhalten Sie die Ausnahme, weil die Funktion compare die Methode CompareTo der Werte aufruft, die Sie vergleichen (also x.ComaperTo(y) ). Die Werte, die Sie mithilfe von compare in der benutzerdefinierten Implementierung von CompareTo vergleichen, sind die Werte, die Sie (zur Laufzeit) vergleichen sollen, sodass der Stapel überläuft.

Die übliche Methode zur Implementierung von CompareTo oder Equals besteht darin, nur einige Werte zu vergleichen, die Sie in Ihrem Typ gespeichert haben. Zum Beispiel könnten Sie etwas wie folgt schreiben:

BEARBEITEN : Sie können eine Hilfsfunktion mycopare schreiben, um den Vergleich durchzuführen (oder Sie könnten einfach die CompareTo Implementierung ändern). Wenn Sie jedoch eine Funktion verwenden möchten, müssen Sie sie innerhalb der Typdeklaration verschieben (damit sie den Typ kennt - beachten Sie, dass in F # die Reihenfolge der Deklaration wichtig ist!)

Eine Möglichkeit, es zu schreiben, ist dies:

%Vor%

Das würde funktionieren, weil jeder Aufruf von compare nur einen Teil der Daten benötigt, also machen Sie ein paar Fortschritte.

    
Tomas Petricek 22.06.2010, 13:27
quelle