2010-12-12 45 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*_的情况下,这代表匿名函数。这两种用法非常接近,很容易让他们感到困惑。