Scala - 为什么不能将上下文绑定的case类用作另一个case类的默认构造函数参数?

时间:2013-10-09 17:41:34

标签: scala

我是Scala的新手,正在尝试使用案例类和上下文边界。在这种情况下,我尝试使用下面的代码创建一个基于案例类的简单搜索树。我想理解为什么我不能将我定义的一个case类作为另一个case类的默认构造函数参数。为什么我得到“没有为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])
}

请记住,我正在尝试学习这门语言,所以“你为什么不这样做呢?”回复,虽然仍然有助于学习,但不会真正回答这个问题。我想知道为什么编译器在抱怨。

1 个答案:

答案 0 :(得分:1)

默认值是在定义网站上创建的,而不是在使用网站上创建的 - 它不可能是任何其他方式。在您定义BST时,您不知道A会是什么,因此您没有Ordering[A]