2013-03-28 27 views
6

mam minimalną definicję tego, co binarne drzewo powinna wyglądać następująco:Rodzaj aliasing nakazał rodzajowych w Scala

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

I teraz chcemy zdefiniować binarny wyszukiwania drzewa jak:

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

ale to się nie kompiluje. Co ja robię źle?

Odpowiedz

8

Błąd kompilacji, który zasadniczo wynika, że ​​ograniczenia kontekstowe nie mogą być używane dla aliasów typów. Kontekstowe granice działają w definicjach funkcji lub klas. Na przykład,

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

jest rzeczywiście skróconym zapisem dla

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

Należy pamiętać, że różne BST obiektów potencjalnie może mieć różne Ordering s, a wartości te muszą być przechowywane w czasie wykonywania.

Dla Państwa przypadku użycia, najłatwiej może być umieścić kontekst związany od funkcji generycznych trzeba pamiętać,

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

Następnie odpowiedni Ordering[T] niejawny będzie można znaleźć na stronie wywoławczy f, gdzie znany jest typ T.

+1

Masz na myśli "Skróconą notację dla:" klasa BST [T] (drzewo val: Drzewo [T]) (domyślna kolejność: Kolejność [T]) '" – Faiz

+0

@Faiz, poprawione dzięki. –