OCaml: warum Vergleichsoperatoren typenunabhängig sind, arithmetische dagegen nicht?

8

Ich frage mich, warum & lt; operator unterstützt int, string, bool oder float, während + nur int.

unterstützt

Kann OCaml die zugrunde liegende Arithmetik erkennen? Was unterscheidet Vergleichsoperator von arithmetischen? Ist es das gleiche für andere FP-Sprache?

    
Pierre G. 29.10.2015, 11:36
quelle

2 Antworten

6

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:

%Vor%

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

%Vor%

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.

F #

%Vor%

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:

%Vor%

Wenn Sie inline hinzufügen, können Sie noch mehr erhalten:

%Vor%

Diese Version funktioniert sowohl für int als auch für float (und jeden anderen Typ (-combination) mit einem statischen Member (+) )

Haskell

%Vor%

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.

OCaml

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 .

    
Stas 29.10.2015, 15:22
quelle
7

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.

>     
Drup 29.10.2015 14:01
quelle

Tags und Links