Während des Studiums Learn You A Haskell For Great Good und Purely Functional Data Structures dachte ich zu versuchen, eine Red Black tree Reimplementierung beim Versuch, eine andere Struktur Invariante strukturell zu erzwingen.Strukturell erzwingen No Red Children des roten Knotens
Paraphrasieren Okasaki Code, seine Knoten sieht in etwa wie folgt aus:
import Data.Maybe
data Color = Red | Black
data Node a = Node {
value :: a,
color :: Color,
leftChild :: Maybe (Node a),
rightChild :: Maybe (Node a)}
Eine der Eigenschaften eines Rot-Schwarz-Baum ist, dass a red node cannot have a direct-child red node, also versuchte ich dies wie folgt zu kodieren:
import Data.Either
data BlackNode a = BlackNode {
value :: a,
leftChild :: Maybe (Either (BlackNode a) (RedNode a)),
rightChild :: Maybe (Either (BlackNode a) (RedNode a))}
data RedNode a = RedNode {
value :: a,
leftChild :: Maybe (BlackNode a),
rightChild :: Maybe (BlackNode a)}
Dies gibt die Fehler:
Multiple declarations of `rightChild'
Declared at: :4:5
:8:5
Multiple declarations of `leftChild'
Declared at: :3:5
:7:5
Multiple declarations of `value'
Declared at: :2:5
:6:5
ich habe versucht, mehr Änderungen des vorherigen Codes, aber alle Fehler bei der Kompilierung. Was ist der richtige Weg, dies zu tun?
Leider können Sie zwei Felder von zwei verschiedenen Typen nicht auf die gleiche Weise benennen. Versuchen Sie, sie 'blackValue, .., blackRightChild' und ähnlich für die roten Gegenstücke zu nennen. – chi
@chi Möge das Chi mit dir sein! Das hat funktioniert! Ich bin erstaunt, dass Haskell diese Einschränkung hat - hätte ich nie gedacht. Würdest du das vielleicht als Antwort schreiben? Ich habe mehrere Stunden damit verbracht, damit herumzuspielen und im ganzen Internet zu suchen - vielleicht wird es jemand anderem helfen. –
Während man die "no red node with red child" -Invariante durchaus durchsetzen kann, stellt sich heraus, dass die vollständige Ergänzung der rot-schwarzen Baum-Invarianten ohne Leistungseinbußen wirklich schwierig ist. Nachdem Sie die Papiere überflogen haben, vermute ich, dass Sie zu der gleichen Schlussfolgerung kommen, die ich gemacht habe - Sie sind im Allgemeinen besser dran, die Kugel zu beißen und statt dessen 2-3-4 Bäume zu verwenden. – dfeuer