abstract class IntSet {
def contains(x: Int): Boolean
def incl(x: Int): IntSet
}
我正在学习Scala。为什么方法incl
的返回类型是IntSet
的类名?这是什么意思?
答案 0 :(得分:1)
通常逻辑和函数式编程语言是声明性的(本身并不强制执行,但在大多数情况下,建议使用声明式样式)。这意味着您不会改变数据结构:您构建一个新的修改后的原始。因此,当您使用IntSet
并且添加元素时,使用声明性语言,不将其添加到IntSet
,构建一个新的IntSet
包含原始IntSet
的所有元素和您添加的x
元素。
因此incl
返回IntSet
的原因是原始的IntSet
未被修改,因此构建了一个新的。{/ p>
通常在构建新的IntSet
时,当然不会构建一个完整的新对象。由于原始IntSet
不应更改,因此可以使用原始IntSet
的子结构。因此,声明性语言通常有自己的一组专用数据结构,例如finger tree。
以IntSet
为例this implementation。我们看到的是:
object Empty extends IntSet {
override def toString = "."
def contains(x: Int): Boolean = false
def include(x: Int): IntSet = new NonEmpty(x, Empty, Empty)
def union(other: IntSet): IntSet = other
}
因此,当我们使用Empty
IntSet
对象时,我们include
使用元素x
,而不是更改对象,我们构建一个新的IntSet
:NonEmpty(x,Empty,Empty)
。此IntSet
包含x
。