我正试图在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