2010-12-12 22 views
19

Stwórzmy wartość ze względu na to pytanie:Scala podkreślenia minimalny funkcja

val a = 1 :: Nil 

teraz mogę wykazać, że anonimowe funkcje mogą być napisane w formie skróconej tak:

a.map(_*2) 

czy można napisać skrót tej funkcji ?:

a.map((x) => x) 

moje rozwiązanie nie działa:

a.map(_) 
+0

To nie ma większego sensu, prawda? To tylko NOP. – delnan

+0

to tylko przykład. może to mieć jakiś sens w kontekście – coubeatczech

+2

Jest to dobry przykład przypadków, w których nadużywanie (imho) cukru "_" w Scali naprawdę utrudnia ludziom zdobycie tego języka. – akauppi

Odpowiedz

20

swojej pierwszej postaci skróconej może być również napisany punktowych wolne

a map (2*) 

Dzięki mnożenie jest przemienne.

Jeśli chodzi o (x) => x, potrzebujesz funkcji identity. Jest to zdefiniowane w Predef i jest ogólne, więc możesz być pewny, że jest bezpieczny w użyciu.

+3

Myślę, że masz na myśli przemianę. – Debilski

+2

Szkoda, że ​​'x => x' ma cztery znaki, a" tożsamość "to osiem. Dlatego nigdy nie używam "tożsamości". –

+0

@debilski Te rzeczy nie są łatwe, wiesz! Nie, gdy 18-miesięczna walka o dostęp do klawiatury! –

15

Należy użyć funkcji identity dla tego przypadku użycia.

a.map(identity) 

identity jest zdefiniowana w scala.Predef jak:

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

Dla rekordu, a.map(_) nie działa, ponieważ oznacza x => a.map(x), a nie a.map(x => x). Dzieje się tak dlatego, że pojedynczy parametr _ zamiast parametru oznacza częściowo zastosowaną funkcję . W przypadku 2*_ oznacza to anonimową funkcję . Te dwa zastosowania są tak bliskie, że bardzo często są przez nich zdezorientowane.