2010-12-12 13 views
19

Lassen Sie sich für die Zwecke dieser Frage einen Wert schaffen:Scala unterstreichen minimale Funktion

val a = 1 :: Nil 

jetzt, kann ich zeigen, dass die anonymen Funktionen können in Kurzform wie folgt geschrieben werden:

a.map(_*2) 

Ist es möglich, eine Kurzform dieser Funktion zu schreiben ?:

a.map((x) => x) 

meine Lösung funktioniert nicht:

a.map(_) 
+0

Macht nicht viel Sinn, oder? Es ist nur ein NOP. – delnan

+0

Dies ist nur ein Beispiel. es kann im Kontext einen Sinn ergeben – coubeatczech

+2

Dies ist ein gutes Beispiel für die Fälle, in denen die Übernutzung (imho) von '_' Zucker in Scala es wirklich schwierig macht, die Sprache zu erlernen. – akauppi

Antwort

20

Ihre erste Kurzform kann auch punktfrei

a map (2*) 

Dank Multiplikation ist kommutativ geschrieben werden.

Wie für (x) => x, möchten Sie die identity Funktion. Dies ist in Predef definiert und generisch, so dass Sie sicher sein können, dass es typsicher ist.

+3

Ich denke du meinst kommutativ. – Debilski

+2

Es ist schade, dass 'x => x' vier Zeichen lang ist, während 'identity' acht ist. Aus diesem Grund verwende ich nie "Identität". –

+0

@debilski Das Zeug ist nicht einfach, weißt du! Nicht wenn es einen 18 Monate alten Kampf um den Zugang zur Tastatur gibt! –

15

Sie sollten identity Funktion für diesen Anwendungsfall verwenden.

a.map(identity) 

identity definiert in scala.Predef als:

implicit def identity[A](x: A): A = x 
35

Für den Datensatz funktioniert a.map(_) nicht, weil es für x => a.map(x) steht, und nicht a.map(x => x). Dies geschieht, weil ein einzelner _ anstelle eines Parameters für eine teilweise angewandte Funktion steht. Im Fall von 2*_ steht das für eine anonyme Funktion. Diese beiden Anwendungen sind so nahe, dass es sehr häufig ist, dass sie von ihnen verwirrt werden.