2013-01-02 137 views
3

为什么需要括号围绕x:诠释在这种情况下:在这种情况下为什么在这里需要括号?

List(1,2,3,4,5).filter((x:Int) => x > 3) 

但不是X:

List(1,2,3,4,5).filter(x => x > 3) 

如果我尝试:

List(1,2,3,4,5).filter(x:Int => x > 3) 

我得到:

identifier expected but integer literal found 

这到底意味着什么?

+0

我试过第二种情况下,它的工作原理上的Scala版本2.9.1 –

+4

都工作得不错。 dublintech只是问为什么它不会编译在第一个版本,如果你省略参数列表的括号 –

+0

@Girafik我已经提出了更清晰的问题。 – dublintech

回答

8

圆括号显示参数类型的结束位置。由于=>符号在scala类型(指示函数类型)中有效,因此只有=>并不意味着该类型已结束。这样考虑:

List(Map(1->2)).filter((x: Int => Int) => x(1) == 2) 

括号清楚地显示,第一=>x类型的一部分和所述第二被定义的功能。

在第二个示例中,x上没有类型,因此=>的作用没有任何歧义。

+1

好理由。只是一个挑逗,这里没有“类型归属”,只有参数类型。 –

+0

@Régis:谢谢,更新。 – dhg

+0

@dhg我不明白如何括号在列表(1,2,3,4,5).filter((x:Int)=> x> 3)中的x:Int中防止任何歧义。我已经更新了问题,或许我的问题是更清楚的问题。 – dublintech

1

x: Int => Int - x是类型的功能Int => Int

(x:Int) => ... - x是函数参数

+0

但是你会在函数文字中使用x:Int => Int吗?你能举个例子吗? – dublintech

+0

val inc =(x:Int)=> x + 1 –