non*_*com 3 methods inheritance scala class
我正在阅读示例书中的Scala,几乎每个例子都有以下结构:
abstract class Stack[A] {
def push(x: A): Stack[A] = new NonEmptyStack[A](x, this)
def isEmpty: Boolean
def top: A
def pop: Stack[A]
}
class EmptyStack[A] extends Stack[A] {
def isEmpty = true
def top = error("EmptyStack.top")
def pop = error("EmptyStack.pop")
}
class NonEmptyStack[A](elem: A, rest: Stack[A]) extends Stack[A] {
def isEmpty = false
def top = elem
def pop = rest
}
Run Code Online (Sandbox Code Playgroud)
我有以下两个相互关联的问题:1)将空和非空元素表示为单独的类是一种常见的Scala实践吗?如果是,那为什么呢?2)为什么孩子们在可能的情况下都实现了同样的愚蠢方式'isEmpty',对我来说,在父母班级中这样做更明智?
我想知道这里涉及的最深刻的哲学.
1)是的,对于空容器和非空容器都有单独的类,这通常称为代数数据结构,但通常不那么明显.例如,Scala的List有两个类,Nil用于表示空列表,::包含一个元素和另一个列表.所以
List(1,2,3)
Run Code Online (Sandbox Code Playgroud)
虽然通常由List[T]特征引用,但实际上是一个实例:: [B] (hd: B, tl: List[B]),如下所示:
::(1, ::(2, ::(3, Nil)))
Run Code Online (Sandbox Code Playgroud)
2)isEmpty如果您注意到,每个类必须实现该方法,每个子类的值都不同.它只是保存一些计算来确定一个实例是否Stack为空,因为每个子类型在编译时都已知道这一点.