3

Scala のOrderedトレイトは非推奨なので、 を使用する必要がありますOrdering。BST クラスを書き直して使用しようとしたOrderingところ、コンパイル エラーが発生しました。誰でも正しい使用方法Orderingを説明できますか。Nothingこれが私のコードです:

abstract sealed class Tree[+A: Ordering] {
  def value: A
  def left: Tree[A]
  def right: Tree[A]
  def isEmpty: Boolean

 /**
  * Time - O(1)
  * Space - O(1)
  */
 def mkTree(v: A, l: Tree[A] = Leaf, r: Tree[A] = Leaf): Tree[A] = 
   Branch(v, l, r)

 /**
  * Fails with message.
  */
 def fail(s: String): Nothing =
   throw new NoSuchElementException(s)
}

case object Leaf extends Tree[Nothing] {
  def value: Nothing = fail("Empty tree.")
  def left: Tree[Nothing] = fail("Empty tree.")
  def right: Tree[Nothing] = fail("Empty tree.")
  def isEmpty: Boolean = true
}

case class Branch[A: Ordering](value: A, left: Tree[A], right: Tree[A]) extends Tree[A] {
  def isEmpty: Boolean = false
}

コンパイルすると、次のようになりました。

Tree.scala:21: error: No implicit Ordering defined for Nothing.
case object Leaf extends Tree[Nothing] {
             ^
   one error found

私はこのクラスを として書いていましたがabstract class Tree[+A <% Ordered[A]]、うまくいきました。

4

2 に答える 2

3

Ordering問題は、ツリーの設定方法ほどではないと思います。エラーメッセージは一目瞭然です。型パラメーターには暗黙的な順序付けが必要だと言いましたが、型パラメーターを指定した場合LeafNothing順序付けはありません。

したがって、everyTreeに順序付けが必要であるという要件は正しくないと思います。これを修正するために必要なのは: Ordering、最初の行から削除することだけです。これは、その要件が に既に含まれているBranchためです。

あなたのmkTreeメソッドにはパラメーターが必要ですが、(implicit ord: Ordering[A])とにかくこのメソッドがどのような目的を果たしているのかわかりません-コンパニオンオブジェクトに属するファクトリメソッドのように見えます(Branchオブジェクトを単に延期するため、そうです)-だから私はそうしますそれを除く。

于 2013-09-01T20:39:40.530 に答える