Warum kann Scala in diesem Beispiel nicht auf den Typparameter schließen?

8

Angenommen, ich habe zwei Klassen, Input und Output , die so konzipiert sind, dass sie miteinander verbunden sind. Output erzeugt Werte eines Typs und Input verwendet sie.

%Vor%

Es ist in Ordnung, wenn ein Paar Input und Output nicht mit demselben Wert arbeitet, solange der Parameter Input type ein Supertyp des Parameters Output type ist. Beachten Sie, dass der Typparameter in beiden Klassen invariant ist. in den realen Versionen wird es sowohl in ko- als auch kontravarianten Positionen verwendet.

Ich habe eine connect Methode woanders, die eine Verbindung zwischen einem Input / Output Paar herstellt:

%Vor%

Wenn ich diese Methode wie folgt aufrufen, erhalte ich einen Typfehler:

%Vor%

Der Fehler ist:

%Vor%

Ich kann das lösen, indem ich den type-Parameter ausschreibe (in diesem Fall würde ich connect[String] schreiben, aber ich denke, der Compiler sollte das für mich herausfinden können. Wie kann ich die Methode connect so ändern dass der Typparameter automatisch abgeleitet wird?

Bearbeiten: Im Moment habe ich connect zu einer Methode von Output gemacht, so dass der Typparameter automatisch abgerufen wird. Dies hat auch den zusätzlichen Vorteil, dass ich die Infix-Notation out connect in verwenden kann, aber das Design fühlt sich etwas peinlich an.

Ich bin immer noch daran interessiert, warum der Compiler dieses Verhalten zeigt. Ich denke, es sollte in der Lage sein, den Typparameter abzuleiten. Funktioniert das tatsächlich wie angegeben?

    
Jay Conrod 26.07.2009, 19:07
quelle

3 Antworten

6

Sie erhalten manchmal bessere Ergebnisse, wenn Sie mehrere Parameterlisten verwenden:

%Vor%

... und in diesem Fall funktioniert es.

    
extempore 26.07.2009 22:58
quelle
0

Ich mag völlig falsch liegen, aber ich denke, das Problem ist, wenn Sie die Eingabe und die Ausgabe zusammenfügen: Die Eingabe hat eine Ausgabe, die auf einen Subtyp von T beschränkt ist, aber die Ausgabe hat eine Eingabe, die auf einen Supertyp von T beschränkt ist, der einzige Typ, der beide Bedingungen erfüllen kann, ist T.

%Vor%

Wenn Sie die Eingabe mit der Ausgabe erstellen (indem Sie Q durch _ & lt ;: T ersetzen), erhalten Sie:

%Vor%

Das Gleiche wie

Eingabe [T] - & gt; Eingabe [_ & lt ;: T & lt; _]

Daher die Typabweichung

    
GClaramunt 27.07.2009 17:30
quelle
0

Eigentlich kann scala type inferene die "Rekursion" vorerst nicht verarbeiten. Also, wenn Art des Arguments nur in Kollokation mit anderen Argument scala fehlschlagen kann, um Schlussfolgerung. Wenn Sie jedoch eine andere Argumentliste verwenden, wird scala f(a)(b)(c,d) Typen nach Liste ableiten, so dass es normalerweise besser funktioniert.

PS Es ist sehr vereinfacht, kann Ihnen aber einen Hinweis geben.

    
yura 30.09.2011 21:58
quelle