3

Scala 编程:全面的分步指南,第 2 版,第 546 页:

在 Iterable 下的继承层次结构中,您可以找到三个特征:Seq、Set 和 Map。这三个 trait 的一个共同点是它们都通过 apply 和 isDefinedAt 方法实现了 PartialFunction trait。

但是,此代码无法编译(尝试了 2.8.2 和 2.10.2):

Set(1, 2, 3).isDefinedAt(1)

有错误:

value isDefinedAt is not a member of scala.collection.immutable.Set[Int]

这是书上的错误吗?

4

2 回答 2

11

确实看起来像。就 Scala 2.5.0 而言:

  • SeqMap扩展PartialFunction
  • Set才不是。

这似乎是明智的:Set从对象映射到Boolean值,所以它总是被定义true对于成员,false对于非成员)。

于 2013-09-03T20:10:49.050 回答
1

在数学中,偏函数X => Y是一个函数X' → Y,其中 X' 是 X 的子集。将 Set 命名为 PartialFunction 是不正确的,因为它是一个全函数 - 它是在每个元素上定义的。

这就是为什么Set(1, 2, 3).isDefinedAt _没有意义 - 它总是等于true

如前所述,Set[T] extends T => Boolean,无论元素是否存在,apply 方法都会产生真或假。如果你愿意,你可以创建

trait NamedSet[T] extends Set[T] with PartialFunction[T,Boolean] {
   def isDefinedAt(x: T) = true
}

如您所见,这没有意义

于 2013-09-03T20:58:04.230 回答