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:
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
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.
Tags und Links f# equals minimax compareto icomparable