SML Warnung: Geben Sie Vars nicht generalisiert ein, wenn Sie leere Listen oder KEINE Option verwenden

8

Ich kann nicht für das Leben von mir herausfinden, warum die folgende SML-Funktion eine Warnung in meinem Hausaufgabenproblem wirft:

%Vor%

Immer wenn ich my_func mit den folgenden Testfunktionen aufrufen:

%Vor%

Ich bekomme immer die Warnung:

  

Warnung: Geben Sie vars nicht generalisiert wegen      Wertbeschränkung werden in Dummy-Typen (X1, X2, ...)

instanziiert

Immer wenn ich eine Optionsliste mit mindestens einem SOME-Wert übergebe, wird diese Warnung nicht ausgelöst. Ich weiß, dass es etwas mit der Tatsache zu tun hat, dass ich Polymorphismus in meiner Funktion currying verwende, aber ich bin völlig stecken geblieben, wie man diese Warnungen loswerden kann.

Bitte helfen Sie, wenn Sie Ideen haben - danke im Voraus!

    
mbear 03.02.2013, 01:05
quelle

1 Antwort

18

Die -Wertbeschränkung , auf die in der Warnung verwiesen wird, ist eine der kniffligsten Sachen, die man in SML verstehen kann. Ich werde jedoch mein Bestes geben, um zu erklären, warum es in diesem Fall auftaucht wenige Ressourcen, um mehr zu erfahren.

Wie Sie wissen, verwendet SML Typinferenz, um die meisten Typen in Ihren Programmen abzuleiten. In diesem Programm wird der Typ von my_func als ('a -> 'b option) -> 'a list -> 'b bezeichnet. Wie Sie bemerkt haben, ist es ein polymorpher Typ. Wenn Sie my_func wie folgt aufrufen

%Vor%

... die Typvariablen 'a und 'b werden in int option und int instanziiert.

Wenn Sie es jedoch ohne einen Wert wie SOME 1 über

aufrufen %Vor%

Worin sollten die Typvariablen instanziiert werden? Die Typen sollten polymorph sein - etwas wie 't option und 't für alle Typen 't . Es gibt jedoch eine Einschränkung, die verhindert, dass solche Werte polymorphe Typen annehmen.

SML definiert einige Ausdrücke als nicht expansive Werte und nur diese Werte können polymorphe Typen annehmen. Sie sind:

  • Literale (Konstanten)
  • Variablen
  • Funktionsausdrücke
  • -Konstruktoren (mit Ausnahme von ref ), die auf nicht expansive Werte angewendet wurden
  • ein nicht expansiver Wert mit einer Typannotation
  • Tupel, wobei jedes Feld ein nicht expansiver Wert ist
  • Datensätze, in denen jedes Feld ein nicht expansiver Wert ist
  • listet auf, wo jedes Feld ein nicht expansiver Wert ist

Alle anderen Ausdrücke, insbesondere Funktionsaufrufe (was der Aufruf von my_func ist) kann nicht polymorph sein. Weder kann Referenzen. Sie könnten neugierig sein zu sehen, dass das Folgende keine Warnung auslöst:

%Vor%

Der abgeleitete Typ ist stattdessen unit -> 'a . Wenn Sie diese Funktion jedoch aufrufen würden, würden Sie die Warnung erneut erhalten.

Mein Verständnis des Grundes für diese Einschränkung ist ein wenig schwach, aber ich glaube, dass das zugrunde liegende Grundproblem veränderbare Referenzen sind. Hier ist ein Beispiel, das ich von der unten verlinkten MLton-Site genommen habe:

%Vor%

Dieses Programm schreibt aufgrund der Werteinschränkung keine Überprüfung unter SML. Gäbe es keine Wertbeschränkung, würde dieses Programm zur Laufzeit einen Typfehler haben.

Wie gesagt, mein Verständnis ist wackelig. Ich hoffe jedoch, ich habe ein wenig Licht auf das Problem geworfen, das Sie kennengelernt haben, obwohl ich glaube, dass Sie in Ihrem Fall die Warnung ignorieren könnten. Hier sind einige Referenzen, wenn Sie sich entscheiden, dass Sie tiefer graben möchten:

Ссылка

Ссылка

(Übrigens ist die MLton-Site solid gold . Es gibt so viel hier versteckt, also wenn Sie versuchen, etwas seltsam über SML zu verstehen, empfehle ich dringend, hier zu suchen, weil Sie wahrscheinlich drehen werden viel mehr, als Sie ursprünglich wollten)

Da es so aussieht, als ob Sie tatsächlich SML / NJ verwenden, ist dies ein ziemlich praktischer Leitfaden für die Fehlermeldungen und Warnungen, die es Ihnen zur Kompilierzeit geben wird:

Ссылка

    
spacemanaki 03.02.2013 04:43
quelle

Tags und Links