Der Typ vergleichbar wird verwendet, um Werte dieses Typs mit anderen Werten desselben Typs zu vergleichen.
Die Operatoren = und <> machen von diesem Typ Gebrauch, um ihre Signaturen zu definieren.
operator'='(:t, :comparable where t:subtype(comparable)):t
operator'<>'(:t, :comparable where t:subtype(comparable)):t
Jede dieser Funktionen ist so definiert, dass sie ein erstes Argument nimmt, das ein beliebiger Untertyp von „vergleichbar“ ist, und ein zweites Argument, das ebenfalls ein beliebiger Untertyp ist und denselben Typ wie das erste Argument zurückgibt.
Der Typ „vergleichbar“ hat viele Untertypen, die du verwenden kannst. Diese Untertypen können sowohl mit anderen Werten des gleichen Typs als auch mit anderen Untertypen von „vergleichbar“ verglichen werden. Zu diesen Untertypen gehören:
intlogicfloatcharchar32- Array, falls alle enthaltenen Typen Untertypen von „vergleichbar“ sind
- Option, falls alle enthaltenen Typen Untertypen von „vergleichbar“ sind
- Tupel, falls alle enthaltenen Typen Untertypen von „vergleichbar“ sind *Karte, wenn alle enthaltenen Typen Untertypen von „Vergleichbar“ sind
Klassen können auch mit dem Spezifizierer „eindeutig“ zu Untertypen von „vergleichbar“ gemacht werden. Instanzen von Klassen mit diesem Bezeichner sind nur sich selbst gleich, selbst dann wenn die enthaltenen Mitglieder gleich sind. Zum Beispiel:
int_ref := class<unique>:
Contents:int
Main()<decides> : void =
X := int_ref{Contents := 0}
Y := int_ref{Contents := 0}
X = X # Succeeds
X = Y # Fails
X <> Y # Succeeds
Derzeit können float, option und Klassen (unabhängig vom Vorhandensein von einzigartig) nicht als Schlüssel von Karten verwendet werden, was bedeutet, dass Kartenschlüssel ein Untertyp von „vergleichbar“ sein müssen, dem kein Name gegeben wird (und daher können Karten-Schlüsseltypen keine parametrischen Typen sein, da die erforderliche Untertypisierung nicht im Code von Verse beschrieben werden kann).
Beachte, da ein Wert eines Untertyps von „vergleichbar“ mit jedem anderen Wert eines anderen Untertyps von „vergleichbar“ verglichen werden kann, können unerwartete Ergebnisse auftreten. Zum Beispiel:
0 = 0,0
Dieses Beispiel wird fehlschlagen, da 0 vom Typ int ist, während 0,0 vom Typ Float ist, und int und Float keine Untertypisierungs-Beziehung teilen.