val Singleton4 : Set = set => set == 4
的冗长方式是什么?我无法理解set
参数的来源。
答案 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
结束,所以Boolean
到set == 4
。
从set
我们可以推断出Int
只能是set
(因此您可以将 apples 与 apples 进行比较)和因此,我们将Int
的类型设为=
。
val
val Singleton4: Set = (set: Int) => set == 4
的右侧也可以写成:
Singleton4
因此,Int => Boolean
val是函数Set
的一个实例,它被称为Set
。 type Set = Int => Boolean
在某处(按字典顺序)声明为Set
:
val Singleton4: Int => Boolean = (set: Int) => set == 4
您可以将{{1}}替换为类型别名,最后是:
{{1}}