2016-06-02 5 views
4

Werfen Sie einen Blick auf diese scala-Schnipsel: wenn wir so etwas wie dieses:Scala unterstreichen Erklärung

List(List(1, 2), List(3, 4), List(5)) map (x => (x.size)) 

wir es verkürzen:

List(List(1, 2), List(3, 4), List(5)) map ((_.size)) 

aber, wenn wir so etwas wie dieses haben :

List(List(1, 2), List(3, 4), List(5)) map (x => (x.size, x.size)) 

warum können wir nicht verkürzen, es zu:

List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size)) 

?

+0

Interessante Frage, ich werde hier bleiben, um die Antwort zu überprüfen – SCouto

Antwort

5

Eine Anzahl von Platzhaltern sollte gleich der Anzahl der Funktionsparameter sein. In Ihrem Fall map hat 1 Parameter, deshalb können Sie nicht zwei Platzhalter verwenden.

+0

Bitte geben Sie mir ein Beispiel, wo ich mit map ((_.size, _.size)) auf der rechten Seite des Ausdrucks enden könnte . – GA1

+1

@ GA1 Sie können nicht 2 Platzhalter mit 'map' Methode verwenden. Beispiel für die Verwendung von 2 Platzhaltern 'List (1,2,3,4) .reduce (_ + _)' - Summenlistenelemente. –

+0

Wie auch immer, mir hat die Antwort auf diese Frage wirklich gefallen http://stackoverflow.com/questions/25763400/motivation-for-scala-underscore-in-terms-of-formal-language-theory-and-good-styl Besonders der Teil mit einem Bezug zur Linguistik. Ich verstehe immer noch nicht, warum der Compiler nicht erlaubt: 'Liste (Liste (1, 2), Liste (3, 4), Liste (5)) map ((_.size, _.size))' Was ist das zugrunde liegende Prinzip? Welche "Gefahr" würde dieses Feature mit sich bringen? – GA1

1

Da List(List(1, 2), List(3, 4), List(5)) map ((_.size, _.size)) eine andere Bedeutung hat, nämlich

List(List(1, 2), List(3, 4), List(5)) map ((x => x.size, y => y.size)) 

(Sie können diese von der Fehlermeldung). Dies wird offensichtlich nicht kompiliert, weil map ein Tupel von zwei Funktionen nicht akzeptiert.