scala set.contains的实现

时间:2014-09-22 12:08:00

标签: scala

type Set = Int => Boolean
/**
* Indicates whether a set contains a given element.
*/
def contains(s: Set, elem: Int): Boolean = s(elem)

为什么这个contains功能有效?

我不明白。 ()运算符如何在集合中返回true / false此元素的存在?

2 个答案:

答案 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这是从IntBoolean的函数,因此调用s(someInt)会返回一个布尔值,您当然要提供该函数:

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

contains({ someInt => someInt == 1 }, 1) // returns true