毫无疑问,这是一件复杂的事情。让我们看看情况如何。
现在我这样做了:
type Sett = Int => Boolean
def union(s: Sett, t: Sett): Sett =
(element: Int) => s(element) || t(element)
val x = Set(1, 2, 3).asInstanceOf[Sett]
val y = Set(4, 5, 6).asInstanceOf[Sett]
val u = union(x, y)
def contains(s: Sett, elem: Int): Boolean = s(elem)
println(contains(u, 6))
注意我正在使用 Sett!未设置。上面的Set其实就是scala.collections.immutable.Set。 Sett 是我自己的自定义“类型”。该类型定义为 Int => Boolean ,即以 Int 作为参数并返回布尔值的函数类型。我将自定义类型重命名为 Sett 以避免混淆一个是我的类型,而另一个属于 Scala 库。
我在上面的代码中强调的另一件事是,我将 Scala 的 Set 转换为我的 Sett!这个演员阵容有效!它是如何工作的?这是因为不可变 Set 继承自 Function1.. 所以效果很好.. 此评论感谢下面的 Jorge
Scala Set 实际上是 Set[Int],因为它是 Set(1,2,3) 等。因此将它转换为符合 Int => Boolean 的子类 Sett 是完全合法的。做吧
val x = Set(1,2,3)
println(x(2))
println(x(4))
因此它证明了 Scala 的 Set 在签名上与 Sett 的这一操作兼容。
不需要联合中的迭代。 Sett 类型持有对两个集合的引用。
如果你这样做:
def union(s: Sett, t: Sett): Sett =
(element: Int) => {
println(element)
s(element) || t(element)
}
val u=union(Set(1,2,3),Set(4,5,6))
.. 然后你调用 u(2) 或其他什么,联合 def 被调用,参数 element=2。然后调用“s(element) || t(element)”。集合操作是 1 阶的,即恒定时间。 s(element) 操作不需要迭代,因为 Set 基本上是不使用值部分的 Map。仅使用键,并且键是唯一的。
Martin Odersky 真的在这里过激,走得太远了。应该更慢。涵盖的概念太多。