为什么不设置实现PartialFunction?

时间:2013-09-03 19:54:20

标签: scala

Scala编程:综合循序渐进指南,第2版,第546页:

  

在Iterable下面的继承层次结构中,您会发现三个特征:Seq,   设置和地图。这三个特征的一个共同方面是它们都是   使用apply和isDefinedAt实现PartialFunction特性   方法

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

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

有错误:

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

这是书中的错误吗?

2 个答案:

答案 0 :(得分:11)

当然看起来像。一直到Scala 2.5.0:

  • SeqMap延长PartialFunction
  • Set没有。

似乎合理:Set从对象映射到Boolean值,因此始终定义(成员true,非成员false )。

答案 1 :(得分:1)

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

这就是Set(1, 2, 3).isDefinedAt _没有意义的原因 - 它始终等于true

如前所述,Set [T]扩展T => Boolean,apply方法导致true或false,元素是否存在。如果需要,可以创建

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

如你所见,它没有意义