簡體   English   中英

Scala-為什么不能將上下文綁定的案例類用作另一個案例類的默認構造函數參數?

[英]Scala - Why can't a context bound case class be used as a default constructor parameter of another case class?

我對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類時似乎可以正常工作:

case class BST[A: Ordering](root: Tree[A]) extends Tree[A] {
  def this() = this(root = Sentinel[A])
}

請記住,我正在嘗試學習該語言,因此“為什么不這樣做呢?。” 回復雖然對學習仍然有幫助,但並不能真正回答問題。 我想知道為什么編譯器會抱怨。

默認值是在定義站點而非使用站點創建的-不可能是其他任何方式。 在您定義BST那一刻,您不知道A是什么,因此您沒有Ordering[A]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM