2013-01-02 74 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 –