2014-10-04 60 views

回答

2

它從任何地方都不是「來」,Set被定義爲從一個整數到布爾值的函數,並且Singleton4的類型恰好是它需要一個整數並返回一個需要另一個整數並返回一個布爾值的函數:

scala> type Set = Int => Boolean 
defined type alias Set 

scala> def singletonSet(elem: Int): Set = set => set == elem 
singletonSet: (elem: Int)Int => Boolean 

scala> val p: Set = singletonSet(3) 
p: Int => Boolean = <function1> 

所以現在p是一個函數,它接受一個整數:

scala> p(3) 
res0: Boolean = true 

scala> p(2) 
res1: Boolean = false 

寫作的另一種方式是這樣的:

def singletonSet(elem: Int) = (i: Int) => i == elem 
val p: (Int) => Boolean = singletonSet(3) 

或使用不同的方式,但實現同樣的結果:

def singletonSet(elem: Int)(i: Int): Boolean = i == elem 
val p: (Int) => Boolean = singletonSet2(3) 

通過討好的功能和應用只有一個參數,你回來仍需要另一個整數全面評價的功能。

+0

什麼轉讓的左手指在「VAL p:(Int)=> Boolean = singletonSet2(3)「我從來沒有見過類似val p的語法:... – 2014-10-04 15:07:21

+0

val p:(Int)=> Boolean'意思是'p'是一個函數,它接受一個整數並返回一個布爾值,如果你曾經使用集合並使用fold,map,reduce等等,檢查它們的簽名,它們都從一個泛型類型'A'中取出一些函數並返回一個泛型類型'B'它在scala語法中寫成'f:A => B',這是'map'沒有噪聲的定義:'def map [B,That](f:A => B)' – 2014-10-04 15:59:15

3

你可能會困惑的是,事實上,Set不是人們所期望的Scala庫。你應該閱讀的路線爲:

val Singleton4: Int => Boolean = someArbitraryName => someArbitraryName == 4 
// <identifier> <type>   = <argument>  => <returnValue> 
0

其他的答案都非常好,但我想我會拋出一些額外的細節,幫助新人瞭解斯卡拉的符號更好(因爲有批註中的一些隱藏的寶石沒有發現/描述)。

讓我們玩Scala編譯器遊戲吧!

以下val對此類型所代表的Set表示足夠的說明。

val Singleton4: Set = set => set == 4 

val的類型明確給出 - 它是Set。然而,我們並不太瞭解它。然而,在編譯器可以使用之前它已經被賦予了,並且從左邊看它是一個函數(介意=>雙字母字符串)從一個類型(我們稍後會介紹它)到Boolean,因爲set == 4將不可避免地結束爲Boolean

set == 4我們可以推斷,set只能Int(這樣你可以比較蘋果蘋果),因此我們已經得到的set類型爲Int

val=的右側也被寫爲:

val Singleton4: Set = (set: Int) => set == 4 

所以,Singleton4 VAL是一個功能Int => Boolean這就是所謂的Set的一個實例。Set「聲明這樣的某個地方上面(字典序):

type Set = Int => Boolean 

您可以替代Set的類型別名,並結了:

val Singleton4: Int => Boolean = (set: Int) => set == 4