型にパラメータ化されたジェネリックデータ型をScalaに実装しようとしてT
いますOrdered[T]
。具体的には、Sleator&Tarjanのスキューヒープ優先度キューの永続バージョンです。こことOdersky-Spoon-Vennersの説明に基づいて複雑な型のパラメーター宣言をたくさん追加した後、実際の機能をテスト/デバッグする前に、コンパイラーエラーが1つ発生しました。
以下は私のコードの簡略版です。
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]