Я пытаюсь реализовать в Scala общий тип данных, параметризованный для типа T
, который должен быть Ordered[T]
.В частности, это постоянная версия приоритетных очередей Sleator & Tarjan skew heap .После добавления множества сложных описаний параметров типа, основанных на объяснении здесь и в 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]
?