Vergleichsoperatoren sind in OCaml besonders. Sie können Datensätze, Variantentypen, Listen und andere Datenstrukturen rekursiv vergleichen.
Sie umgehen ein Typsystem (hoffe, ich habe es richtig formuliert), und haben eine besondere Unterstützung in der Laufzeit. Ich würde empfehlen, diesen Beitrag über den polymorphen OCaml-Vergleich zu lesen.
Vergleichsoperatoren <
, >
, <>
, =
haben dieselbe Signatur:
Und sie geben immer bool
unabhängig vom Typ der Eingabeargumente zurück. Diese Operatoren haben möglicherweise ein polymorphes Verhalten und benötigen keine zusätzliche Unterstützung durch das Typsystem für die Typinferenz:
Der Typ der Funktion less
wird automatisch zu
abgezogen %Vor%Gleichzeitig hängt der Rückgabetyp arithmetischer Operatoren vom Typ der Argumente ab:
%Vor% Siehe, Sie können den Typ von a + b
ausdruck nicht automatisch auf den polymorphen Operator +
zurückführen. Type System sollte erweitert werden, um dies zu unterstützen.
Es wird standardmäßig nach int
abgezogen. Um plus
function für Floats schreiben zu können, müssen Sie mindestens einem der Eingabeargumente eine explizite Typnotiz hinzufügen:
Wenn Sie inline
hinzufügen, können Sie noch mehr erhalten:
Diese Version funktioniert sowohl für int
als auch für float
(und jeden anderen Typ (-combination) mit einem statischen Member (+)
)
Rückgabe- und Argumenttypen der plus
-Funktion werden automatisch auf einen beliebigen Typ von Num
type-Klasse abgeleitet. Dies bedeutet, dass plus
wirklich polymorph ist und mit Ints, Floats und anderen numerischen Typen verwendet werden kann.
Es kann also ein weiterer spezieller Fall (wie in F #) oder eine voll funktionsfähige Lösung wie Haskells Typenklassen sein. Ich stimme für Letzteres.
Es gibt eine Abzweigung von OCaml, die dieses Problem löst, indem es mit modulare Implikationen .
Im Moment gibt es keine Vorstellung von "ein bisschen polymorph" in OCaml (der technische Name ist "Ad-hoc-Polymorphismus"). Du kannst nicht sagen "Ich akzeptiere ganze Zahlen und schwimmt, aber nicht den Rest".
Sie können jedoch sagen "ich akzeptiere alles", genau wie der Vergleichsoperator (der technische Name ist "parametrischer Polymorphismus"). Beachten Sie jedoch, als sie ein wenig darüber lügen: Sie können Funktionen nicht vergleichen, auch wenn das Typsystem es nicht abfangen kann.
Siehe diese Antwort für Details.
>Tags und Links functional-programming ocaml