为什么调用这样的函数在Scala中有效?

时间:2014-06-05 14:46:23

标签: scala functional-programming

我有以下Scala代码段:

type Set = Int => Boolean

def contains(s: Set, element:Int): Boolean = s(element)

def singletonSet(element: Int): Set = Set(element)

val oneElementSet = singletonSet(5)

contains(oneElementSet, 5) // true
contains(oneElementSet, 6) // false

我试图围绕它做什么:Set(element)。看起来它将替换元素代替Int参数,以产生这个:5 =>布尔。在任何地方都没有比较,那么为什么oneElementSet(5)返回true,而oneElementSet(6)返回false?

谢谢!

1 个答案:

答案 0 :(得分:2)

Scala具有用于类型和值的单独命名空间。您的类型别名定义类型名称空间中Set的内容,但singletonSet Set的定义来自值名称空间,实际上它是伴随对象scala.collection.immutable.SetSet(element)调用随播对象的apply方法,该方法返回scala.collection.immutable.Set[Int],结果是Int => Boolean的子类型,因此是Set(您的类型别名)。