2013-03-28 5 views
6

Ich habe eine minimale Definition das, was ein binärer Baum aussehen soll:Typ Aliasing bestellt Generika in Scala

type BST[T: Ordering] = Tree[T] 

:

type Tree[T] = Option[Node[T]] 
case class Node[T](left: Tree[T], entry: T, right: Tree[T]) 

ich jetzt einen binären Suche Baum als definieren will aber das kompiliert nicht. Was mache ich falsch?

Antwort

8

Der Kompilierungsfehler, den Sie erhalten, besagt grundsätzlich, dass Kontextgrenzen nicht für Typaliase verwendet werden können. Kontextgrenzen funktionieren in Funktions- oder Klassendefinitionen. Zum Beispiel

class BST[T: Ordering](val tree: Tree[T]) 

ist eigentlich Kurzschreibweise für

class BST[T](val tree: Tree[T])(implicit ordering: Ordering[T]) 

Beachten Sie, dass verschiedene BST Objekte möglicherweise unterschiedliche Ordering s haben könnten, und diese Werte müssen zur Laufzeit gespeichert werden.

Für Ihren Anwendungsfall könnte die einfachste Sache sein, den Kontext auf die generischen Funktionen, die Sie im Sinn haben, gebunden zu setzen,

def f[T: Ordering](t1: Tree[T], t2: Tree[T]) { 
    import scala.math.Ordering.Implicits._ 
    t1.get.entry < t2.get.entry 
} 

Dann wird die entsprechende Ordering[T] implizite wird an der Aufrufstelle von f gefunden werden, wo der Typ T bekannt ist.

+1

Sie meinen "Kurzschreibweise für:' Klasse BST [T] (Val Baum: Baum [T]) (implizite Reihenfolge: Bestellung [T]) '" – Faiz

+0

@Faiz, fester Dank. –