斯卡拉的Ordered
特性是depricated,所以我們必須使用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]]
它工作得很好。
我同意'value','left'和'right'不需要是在'Tree'特質。我認爲OP正在執行'List',詳見Programming In Scala的第22章。 'head'和'tail'在'List'中定義,而不是在'::'中定義。不知道爲什麼,但我懷疑它是功能較弱的類型系統的遺留功能。 –