我正試圖在Scala中實現一個類型爲T
(應該是Ordered[T]
)參數化的通用數據類型。具體來說,它是Sleader的持久版本& Tarjan的skew heap優先級隊列。在根據解釋here和Odersky-Spoon-Venners添加了大量複雜的類型參數聲明之後,我可以在測試/調試實際功能之前編譯錯誤。通用優先級隊列中的同向和反向類型
下面是我的代碼的簡化版本。
abstract class SkewHeap[+T] {
// merge two heaps
def +[U >: T <% Ordered[U]](x : SkewHeap[U]) : SkewHeap[U]
// remove least element, return new heap
def delMin[U >: T <% Ordered[U]] : SkewHeap[U]
def isEmpty : Boolean
def min : T
def left : SkewHeap[T]
def right : SkewHeap[T]
}
case object Leaf extends SkewHeap[Nothing] {
def +[U <% Ordered[U]](that : SkewHeap[U]) = that
def isEmpty = true
}
case class Node[+T](left : SkewHeap[T],
min : T,
right : SkewHeap[T]) extends SkewHeap[T] {
def +[U >: T <% Ordered[U]](that : SkewHeap[U]) : SkewHeap[U] =
that match {
case Leaf => this
case Node(l,y,r) => if (this.min < that.min)
Node(this.right + that, this.min, this.left)
else
Node(this + that.right, that.min, that.left)
}
def delMin[U >: T <% Ordered[U]] : SkewHeap[U] = left + right
def isEmpty = false
}
這提供了以下錯誤:
skew.scala:28: error: no implicit argument matching parameter type (T) => Ordered[T] was found.
def delMin[U >: T <% Ordered[U]] : SkewHeap[U] = left + right
我試過的delMin
聲明的幾個變種,但無濟於事。我想我明白這個問題(方法+
想要訂購保證),但我應該在哪裏放置?是否有辦法申報delMin
返回SkewHeap[T]
而不是SkewHeap[U]
?
不,它結合'U'。 'scala> def + [U>:T <%Ordered [U]] = 0; $ plus:[U>:T](隱式證據$ 1:(U)=> Ordered [U])Int'。 – retronym 2010-07-31 07:22:41
我試過這個,但我得到完全相同的編譯器錯誤。 – 2010-08-02 12:55:27