2010-12-12 14 views
19

Creiamo un valore per il bene di questa domanda:Scala sottolineatura funzione minima

val a = 1 :: Nil 

ora, posso dimostrare che le funzioni anonime possono essere scritte in forma abbreviata come questo:

a.map(_*2) 

è possibile scrivere una scorciatoia di questa funzione ?:

a.map((x) => x) 

la mia soluzione non funziona:

a.map(_) 
+0

Non ha molto senso, vero? È solo un NOP. – delnan

+0

questo è solo un esempio. può avere un senso nel contesto – coubeatczech

+2

Questo è un buon esempio dei casi in cui l'uso eccessivo (imho) di zucchero '_' in Scala rende davvero difficile per le persone a prendere la lingua. – akauppi

risposta

20

La prima forma abbreviata può anche essere scritto connessione point-

a map (2*) 

Grazie alla moltiplicazione essere commutativa.

Per quanto riguarda (x) => x, si desidera la funzione identity. Questo è definito in Predef ed è generico, quindi puoi essere sicuro che sia sicuro dal tipo.

+3

Penso che tu intenda commutativo. – Debilski

+2

È un peccato che 'x => x' sia di quattro caratteri mentre' identity' è otto. Questo è il motivo per cui non uso mai "identità". –

+0

@debilski Questa roba non è facile lo sai! Non quando c'è un combattimento di 18 mesi per l'accesso alla tastiera! –

15

È necessario utilizzare la funzione identity per questo caso d'uso.

a.map(identity) 

identity è definita scala.Predef come:

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

Per la registrazione, a.map(_) non funziona perché corrisponde a x => a.map(x) e non a a.map(x => x). Ciò accade perché un singolo _ al posto di un parametro corrisponde a una funzione parzialmente applicata. Nel caso di 2*_, ciò significa una funzione anonima . Questi due usi sono così vicini che è molto comune confondersi con loro.

Problemi correlati