Warum kompiliert dieser F # / OCaml-Ausdruck?

8

Dieser Code lässt sich sowohl in F # als auch in OCaml gut kompilieren:

%Vor%

Ich habe sowohl in FSI als auch in Utopie getestet. Es gibt immer true zurück.

Das jqk3jtl23jtlk123 ist völlig zufällig und sein Typ wird als 'a abgeleitet. Selbst wenn ich k auf einen Datentyp (z. B. let testmatch (k: int) = ) beschränke, kompiliert es (obwohl es offensichtlich den testmatch -Typ auf int -> bool anstatt auf 'a -> bool beschränkt.

)

Könnte jemand bitte erklären, was vor sich geht? Speziell:

  • Warum akzeptiert der Compiler ein völlig zufälliges Literal jqk3jtl23jtlk123 ?
  • Warum bekomme ich keine unermüdliche Spielwarnung?
  • Was macht das Spiel eigentlich?
Prashant Vaibhav 15.09.2017, 14:40
quelle

2 Antworten

15

In diesem Fall ist das "Literal" jqk3jtl23jtlk123 ein gültiger Variablenname, und das, was das Muster links von -> beschreibt, ist dasselbe, als hätten Sie let jqk3jtl23jtlk123 = k geschrieben. Da dies einen beliebigen Wert von k akzeptiert und seinen Typ nicht einschränkt, weil die Bindung für alle Typen funktioniert, ist der abgeleitete Typ 'a , der allgemeinste Wert, den das Typsystem darstellen kann.

Wenn Sie das Literal zu etwas machen, das kein gültiger Bezeichner ist, zum Beispiel mit einer Ziffer, wird es nicht kompiliert.

Wenn Sie das Literal in Anführungszeichen setzen, wird es als String-Wert-Literal interpretiert. Sie sollten die nicht erschöpfende Übereinstimmungswarnung erhalten und den k -Typ auf string beschränken.

    
Honza Brestan 15.09.2017, 14:48
quelle
9

Dies ist ein Wildcard-Muster, das angibt, was k gleich ist. Dies entspricht

%Vor%     
Étienne Millon 15.09.2017 16:21
quelle

Tags und Links