error: polymorpher Ausdruck mit Standardargumenten

8

Das folgende Bugs:

%Vor%

Dies ergibt

%Vor%

Es ist ziemlich ärgerlich, dass ich den Typparameter in Set.empty wiederholen muss. Warum schlägt die Typinferenz mit diesem Standardargument fehl? Folgendes funktioniert:

%Vor%

Bitte beachten Sie, dass dies insbesondere mit Set nichts zu tun hat:

%Vor%

Seltsamerweise funktioniert das nicht nur:

%Vor%

... aber auch das:

%Vor%     
0__ 28.10.2012, 14:26
quelle

1 Antwort

5
___ tag123scala ___ Scala ist eine universelle Programmiersprache, die hauptsächlich auf die Java Virtual Machine abzielt. Entwickelt, um gängige Programmiermuster in einer prägnanten, eleganten und typsicheren Weise auszudrücken, vereint es sowohl imperative als auch funktionale Programmierstile. Seine Hauptmerkmale sind: fortgeschrittenes statisches System mit Typinferenz; Funktionstypen; Muster-Matching; implizite Parameter und Konvertierungen; Überlastung des Bedieners; volle Interoperabilität mit Java; Nebenläufigkeit ___ tag123type-interferenz ___ Typ-Inferenz ist der Prozess, bei dem automatisch Typen für Programme abgeleitet werden, wobei Regeln verwendet werden, die von einem Typsystem definiert werden. ___ tag123defaultvalue ___ Ein Standard in der Informatik bezieht sich auf eine Einstellung oder einen Wert, der einer Softwareanwendung, einem Computerprogramm oder einem Gerät automatisch zugewiesen wird, und zwar außerhalb des Benutzereingriffs. ___ qstntxt ___

Das folgende Bugs:

%Vor%

Dies ergibt

%Vor%

Es ist ziemlich ärgerlich, dass ich den Typparameter in empty wiederholen muss. Warum schlägt die Typinferenz mit diesem Standardargument fehl? Folgendes funktioniert:

%Vor%

Bitte beachten Sie, dass dies insbesondere mit A nichts zu tun hat:

%Vor%

Seltsamerweise funktioniert das nicht nur:

%Vor%

... aber auch das:

%Vor%     
___ qstnhdr ___ error: polymorpher Ausdruck mit Standardargumenten ___ antwort13111372 ___

Sie können den Typ direkt in der Methode A angeben, anstatt den zusätzlichen Satz von Klammern / Klammern und den Typ Annotation hinzufügen zu müssen:

%Vor%

Warum die Typinferenz fehlschlägt, finden Sie in den folgenden Fragen:

Aktualisierung:

Ich entschuldige mich, meine voreilige Antwort war weit weg. Das Problem in den obigen Beiträgen steht nicht wirklich mit diesem Problem in Zusammenhang. @TravisBrown hat in seinem Kommentar oben einen sehr guten Punkt gemacht. Dies scheint zunächst zu funktionieren:

%Vor%

Aber wenn Sie tatsächlich versuchen, den Konstruktor aufzurufen, schlägt dies an der Verwendungsstelle fehl:

%Vor%

Dies legt nahe, dass der Compiler den Default-Parameter nicht für alle Nothing gültig macht, nur für einige List . Sie haben wahrscheinlich diese Wahl getroffen, damit Sie so etwas tun können:

%Vor%

Jede Art der Verschachtelung mit dem parametrisierten Typ kann jedoch keine Überprüfung an der Deklarationsstelle im Konstruktor eingeben:

%Vor%

Die Inferenz schlägt nicht fehl, wenn sich der Typparameter in einer kovarianten Position befindet:

%Vor%

Diese funktionieren, weil der Compiler standardmäßig %code% als kovarianten Typ auswählt. Dies funktioniert gut für %code% , aber das zweite obige Beispiel funktioniert nicht, wenn Sie tatsächlich versuchen, es aufzurufen.

Der Grund für die meisten dieser Seltsamkeit ist wahrscheinlich die Art und Weise, wie Scala Standardargumente behandelt. Der Compiler fügt dem Companion-Objekt automatisch eine zusätzliche Methode hinzu, und an der Stelle, an der Sie kein Argument angeben, fügt der Compiler automatisch der neuen Methode im Companion-Objekt einen Methodenaufruf hinzu, um stattdessen das fehlende Argument zu generieren. Es sieht so aus, als würde das Abstrahieren des Standardarguments in eine Methode einige Dinge in der Typinferenz, die mit einer normalen Zuweisung funktionieren würden, unterbrechen.

Ich denke, die meisten dieser Ergebnisse sind ziemlich verwirrend. Was ich davon wegnehme ist, dass es wichtig ist, deine Standardparameter zu testen, um sicher zu gehen, dass sie die Typkorrektheit nicht brechen, wenn du sie verwendest!

    
___
DaoWen 28.10.2012, 17:48
quelle