【问题标题】:Implementation of scala set.containsscala set.contains 的实现
【发布时间】:2014-09-22 12:08:00
【问题描述】:
type Set = Int => Boolean
/**
* Indicates whether a set contains a given element.
*/
def contains(s: Set, elem: Int): Boolean = s(elem)

为什么这个contains 函数有效?

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

【问题讨论】:

  • 课程又开课了吗?在过去的一两天里,有一些设置为函数的问题......

标签: scala


【解决方案1】:

这一段一段一段,第一行的类型别名表示我们可以将第二行改写如下:

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 做同样的事情。

【讨论】:

  • 谢谢,但我还是不明白,为什么 "s.apply(elem)" 如果 elem 存在则返回 true,如果 elem 不在集合中,为什么它返回 false?
  • 已更新——如果这不能让事情更清楚,请告诉我。
【解决方案2】:

Set这里是一个从IntBoolean的函数,所以调用s(someInt)返回一个布尔值,你当然要提供那个函数:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2021-10-17
    • 2013-05-29
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多