Warum kann Scala nicht auf den Typ von _ schließen?

8

Ich habe in Scala gehört, dass ich _ als "anonymer Parameter" in der anonymen Funktion verwenden kann:

%Vor%

Aber dieser Code kann nicht kompiliert werden:

%Vor%

Und das kann:

%Vor%

Es scheint über Typschlussfolgerung zu sein. Aber wie könnte x => x mehr Informationen liefern als _ ?

    
Lai Yu-Hsuan 21.12.2013, 19:24
quelle

2 Antworten

13

Das Problem hier ist keine Typrückschluss.

Wie Sie aus dem äquivalenten Code der Fehlermeldung für s.map(_) sehen, ist nicht s.map(x => x) , aber dies:

%Vor%

Genau wie print(_) (tatsächlich Predef.print(_) ) bedeutet i => Predef.print(i) .

Oder wie "a" + _ bedeutet "a".+(_) bedeutet s => "a".+(s) .

Dies macht im aktuellen Kontext einfach keinen Sinn.

Nehmen wir an, Sie haben eine Liste von Funktionen String => String ( fs ) und Sie möchten alle diese Funktionen auf die Liste von String anwenden. Du benutzt diesen Code:

%Vor%

oder nur das:

%Vor%

Zusatz: Sie könnten stattdessen identity method verwenden, wenn x => x . Es wird standardmäßig importiert, aber Sie könnten es noch kürzer machen, indem Sie den Import hinzufügen:

%Vor%

Beachten Sie, dass identity ein bekannter Name ist, also sollten Sie ihn im Team anstelle Ihrer Aliase verwenden.

    
senia 21.12.2013, 19:38
quelle
0
  

Es scheint über Typschlussfolgerung zu sein. Aber wie könnte x = & gt; x liefern mehr Informationen als _?

x = & gt; x ist ein Typ von Function1, der von der Map-Funktion als Parameter erwartet wird. Der Compiler kann nicht schließen, dass die anonyme Variable _ vom Typ T tatsächlich eine Funktion1 ist.

    
whaley 21.12.2013 19:42
quelle

Tags und Links