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!
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
... die Typvariablen 'a
und 'b
werden in int option
und int
instanziiert.
Wenn Sie es jedoch ohne einen Wert wie SOME 1
über
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:
ref
), die auf nicht expansive Werte angewendet wurden 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:
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: