【发布时间】:2010-07-30 17:10:01
【问题描述】:
我正在尝试在 Scala 中实现一个在类型 T 上参数化的通用数据类型,它应该是 Ordered[T]。具体来说,它是 Sleator & 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]?
【问题讨论】:
标签: scala covariance priority-queue abstract-data-type