集合来自“val Singleton4:Set = set => set == 4”?

时间:2014-10-04 12:09:27

标签: scala

val Singleton4 : Set = set => set == 4的冗长方式是什么?我无法理解set参数的来源。

3 个答案:

答案 0 :(得分:3)

您可能会感到困惑的是Set不是人们对Scala库的期望。您应该将该行读作:

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

答案 1 :(得分: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)

通过调整函数并仅应用一个参数,您将获得一个仍需要另一个整数来完全评估的函数。

答案 2 :(得分:0)

其他答案非常好,但我想我会抛出一些额外的细节来帮助Scala的新手更好地理解这个符号(因为有一些隐藏的宝石没有被发现/描述)。 / p>

让我们玩Scala编译器游戏!

以下val充分说明了该类型所代表的Set

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

val的类型是明确给出的 - 它是Set。但是,我们对此却知之甚少。然而,它必须在它被使用之前给予编译器,并且在左侧给出它是一个类型的函数(记住=>两个字母的字符串)(我们将得到)因为Boolean将不可避免地以set == 4结束,所以Booleanset == 4

set我们可以推断出Int只能是set(因此您可以将 apples apples 进行比较)和因此,我们将Int的类型设为=

val val Singleton4: Set = (set: Int) => set == 4 的右侧也可以写成:

Singleton4

因此,Int => Boolean val是函数Set的一个实例,它被称为Settype Set = Int => Boolean 在某处(按字典顺序)声明为Set

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

您可以将{{1}}替换为类型别名,最后是:

{{1}}