私は Scala の初心者で、ケース クラスとコンテキスト バウンドを試しています。この場合、以下のコードを使用して、ケース クラスに基づいて単純な検索ツリーを作成しようとしています。定義したケース クラスの 1 つを別のケース クラスのデフォルト コンストラクター パラメーターとして使用できない理由を理解したいと思います。「A に対して暗黙的な順序付けが定義されていません」というエラーが表示されるのはなぜですか?
object FunWithBST extends App {
abstract class Tree[A](implicit ord: Ordering[A]) {
import ord._
def insert(value: A): Tree[A] = this match {
case BST(root) => BST(root.insert(value))
case Sentinel() => Node(l = Sentinel[A], v = value, r = Sentinel[A])
case Node(l, v, r) if (value < v) => Node(l.insert(value), v, r)
case Node(l, v, r) if (value > v) => Node(l, v, r.insert(value))
}
}
/* Following line gets the error:
No implicit Ordering defined for A.
case class BST[A: Ordering](root: Tree[A] = Sentinel[A]) extends Tree[A]
^
*/
case class BST[A: Ordering](root: Tree[A] = Sentinel[A]) extends Tree[A]
case class Node[A: Ordering](l: Tree[A], v: A, r: Tree[A]) extends Tree[A]
case class Sentinel[A: Ordering] extends Tree[A]
}
それには正当な理由があると確信していますが、特にこのようなケースクラスを定義すると問題なく動作するように見える場合に、なぜエラーが発生するのかは不明です。
case class BST[A: Ordering](root: Tree[A]) extends Tree[A] {
def this() = this(root = Sentinel[A])
}
私は言語を学ぶために実験しているので、「これをやってみませんか..?」と覚えておいてください。返信は学習には役立ちますが、実際には質問には答えません。コンパイラが不平を言っている理由を知りたいです。