2010-12-12 83 views
19

讓我們對這個問題的緣故創造價值:斯卡拉強調最小功能

val a = 1 :: Nil 

現在,我可以證明,匿名函數可以簡寫形式寫成這樣:

a.map(_*2) 

是否可以編寫此功能的簡寫?:

a.map((x) => x) 

我的解決方案不起作用:

a.map(_) 
+0

沒有多大意義,是嗎?這只是一個NOP。 – delnan 2010-12-12 14:11:50

+0

這只是一個例子。它可以在上下文中產生一些意義 – coubeatczech 2010-12-12 14:21:19

+2

這是一個很好的例子,說明Scala中'_'糖的過度使用(imho)真的使得人們難以接受語言。 – akauppi 2013-03-03 21:29:25

回答

20

你的第一個簡寫形式,也可以寫自由點

a map (2*) 

由於乘法是可交換的。

至於(x) => x,你想要identity函數。這在Predef中定義並且是通用的,所以您可以確定它是類型安全的。

+3

我認爲你的意思是交換。 – Debilski 2010-12-12 14:19:00

+2

可惜'x => x'是四個字符,而'identity'是八個字符。這就是爲什麼我從不使用「身份」。 – 2010-12-12 14:50:05

+0

@debilski這東西不容易,你知道!不是當18個月的戰鬥時間來訪問鍵盤! – 2010-12-12 18:45:58

15

您應該對此用例使用identity函數。

a.map(identity) 

identityscala.Predef定義爲:

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

根據記錄,a.map(_)不起作用,因爲它代表x => a.map(x),而不是a.map(x => x)。發生這種情況是因爲單個_代替參數代表部分應用的函數。在2*_的情況下,這代表匿名函數。這兩種用法非常接近,很容易讓他們感到困惑。