二分木がどのように見えるべきかについて、最小限の定義があります。
type Tree[T] = Option[Node[T]]
case class Node[T](left: Tree[T], entry: T, right: Tree[T])
二分探索木を次のように定義したいと思います。
type BST[T: Ordering] = Tree[T]
しかし、それはコンパイルされません。私は何を間違っていますか?
二分木がどのように見えるべきかについて、最小限の定義があります。
type Tree[T] = Option[Node[T]]
case class Node[T](left: Tree[T], entry: T, right: Tree[T])
二分探索木を次のように定義したいと思います。
type BST[T: Ordering] = Tree[T]
しかし、それはコンパイルされません。私は何を間違っていますか?
あなたが得ているコンパイルエラーは、基本的に、コンテキスト境界は型エイリアスに使用できないと言っています。コンテキスト境界は、関数またはクラス定義で機能します。例えば、
class BST[T: Ordering](val tree: Tree[T])
実際には略記です
class BST[T](val tree: Tree[T])(implicit ordering: Ordering[T])
BST
異なるオブジェクトは潜在的に異なる を持っている可能性がOrdering
あり、それらの値は実行時に保存する必要があることに注意してください。
あなたのユースケースでは、最も簡単な方法は、念頭に置いているジェネリック関数にコンテキストをバインドすることです。
def f[T: Ordering](t1: Tree[T], t2: Tree[T]) {
import scala.math.Ordering.Implicits._
t1.get.entry < t2.get.entry
}
次に、タイプが既知Ordering[T]
の の呼び出しサイトで、適切な暗黙的が見つかります。f
T