0

我对 Scala 很陌生,并且正在尝试案例类和上下文边界。在这种情况下,我尝试使用下面的代码创建一个基于案例类的简单搜索树。我想了解为什么我不能将我定义的案例类之一用作另一个案例类的默认构造函数参数。为什么我会收到“没有为 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 回答