2010-12-12 19 views
19

en bu soruya uğruna bir değer yaratalım altını Bu fonksiyonun bir kısa harfini yazmak mümkün mü?:Scala minimal fonksiyon

a.map((x) => x) 

Çözümüm çalışmıyor:

a.map(_) 
+0

Çok anlamlı değil, değil mi? Bu sadece bir NOP. – delnan

+0

bu sadece bir örnektir. bağlamda bir anlam ifade edebilir – coubeatczech

+2

Bu, Scala'daki '_' şekerin aşırı kullanımının (imho) insanların dili almasını gerçekten zorlaştırdığı durumlara iyi bir örnektir. – akauppi

cevap

20

İlk steno formunda da değişmeli olarak çarpma noktası içermeyen

a map (2*) 

Teşekkür yazılabilir.

(x) => x'a gelince, identity işlevini istiyorsunuz. Bu Predef'te tanımlanmıştır ve geneldir, bu yüzden tür güvenli olduğundan emin olabilirsiniz.

+3

Bence değişmeli demek istiyorsun. – Debilski

+2

Bu üzücü, 'x'> x', 'kimlik' sekiz iken dört karakterdir. Bu yüzden asla 'kimlik' kullanmam. –

+0

@debilski Bu şey bildiğiniz kadar kolay değil! Klavyeye erişim için 18 aylık bir kavga olduğunda değil! –

15

Bu kullanım durumu için identity işlevini kullanmalısınız.

a.map(identity) 

identity olarak scala.Predef tanımlanır:

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

Kayıt için a.map(_), x => a.map(x) anlamına gelir ve a.map(x => x) değil. Bu, bir _ parametresinin yerine bir kısmen uygulanmış işlev anlamına gelir. 2*_ durumunda, bu anonim işlevi anlamına gelir. Bu iki kullanım o kadar yakın ki, onlar tarafından karıştırılmak için çok yaygındır.