0

私は 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])
}

私は言語を学ぶために実験しているので、「これをやってみませんか..?」と覚えておいてください。返信は学習には役立ちますが、実際には質問には答えません。コンパイラが不平を言っている理由を知りたいです。

4

1 に答える 1

1

デフォルト値は、使用サイトではなく、定義サイトで作成されます。他の方法ではありえませんでした。を定義している時点ではBST、何がどうAなるかわからないため、 . はありませんOrdering[A]

于 2013-10-09T18:26:45.727 に答える