type Set = Int => Boolean
/**
* Indicates whether a set contains a given element.
*/
def contains(s: Set, elem: Int): Boolean = s(elem)
为什么这个contains
功能有效?
我不明白。
()
运算符如何在集合中返回true
/ false
此元素的存在?
答案 0 :(得分:6)
逐一拍摄,第一行中的类型别名意味着我们可以按如下方式重写第二行:
def contains(s: Int => Boolean, elem: Int): Boolean = s(elem)
但是A => B
只是Function1[A, B]
的语法糖,所以我们可以做更多的重写:
def contains(s: Function1[Int, Boolean], elem: Int): Boolean = s(elem)
s(elem)
也是语法糖 - 任何时候你"申请"通过这种方式将值赋值给某个值,Scala将其设为s.apply(elem)
:
def contains(s: Function1[Int, Boolean], elem: Int): Boolean = s.apply(elem)
如果你看the apply
method on Function1
,你会发现这些类型排成一行。
这就是它 - 我们只是将该集合表示为indicator function,然后将其隐藏在三层语法糖之下。
更新以解决注释:将一个集合表示为其指标函数,可以比通常的基于列表的表示更自然地模拟无限集(以及许多其他集合)。例如,假设我想要一组所有奇数。使用此处的表示,这很容易:
val odds: Set[Int] = (_ % 2 != 0)
例如,尝试使用HashSet
执行相同的操作。
答案 1 :(得分:1)
Set
这是从Int
到Boolean
的函数,因此调用s(someInt)
会返回一个布尔值,您当然要提供该函数:
def contains(s: Set, elem: Int): Boolean = s(elem)
contains({ someInt => someInt == 1 }, 1) // returns true