私は例の本の中でScalaのを読んでいますと、以下のような構成があり、ほぼすべての例の背後にある考え方を理解しようとしている:読書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
}
をそして、私は2つの相互接続された質問に次のようしています。 1)空の要素と空でない要素を別々のクラスとして表現するのは、Scalaの一般的なプラクティスですか?はいの場合、なぜですか? 2)なぜ、子供たちは両方とも、親クラスでこれを行うのがより賢明で、同じ愚かな方法を「空である」と実装していますか?
私は、ここに関わる最も深い哲学を知りたいと思います。
Erlang、Clojure、Lispに簡単に触れている間に私が以前気付いていた機能的な、より正確には "リスト指向の"プログラミングの基礎の1つに戻るようです。したがって、これには本当に本質的な意味が必要です。第2の質問については、あなたの答えのおかげで、私はそれが、そのようなアプローチのすべての力を目撃するのはあまりにも単純な例であることを理解しています。 – noncom
それは一般的なプラクティスですか?コレクション - おそらく、一般的なアプリケーションのコーディングですが、代わりにOptionを使用します。私にとって、両方の質問には1つの答えがあります - 著者は継承がどのように具体的にどのように抽象クラスとメソッドを使用できるかを示すことを意図しました。 isEmpty、top、popは抽象メソッドとしてデモされているため、継承クラスで実装する必要があり、異なる実装を持つことができます。これは単なる意見であり、回答として投稿していない。それが役に立てば幸い! – aishwarya
また、この部門は次のような質問に答えるのに役立ちます:「スタック上で動作するが、**コンパイル時に**失敗した関数を、空スタックに渡すにはどうすればいいですか?」 – Jamil