2014-10-04 64 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