2013-03-28 29 views
6

Tôi có một định nghĩa tối thiểu về những gì một cây nhị phân nên hình như:Loại răng cưa ra lệnh Generics trong Scala

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

bây giờ tôi muốn xác định một nhị phân tìm kiếm cây như:

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

nhưng điều đó không biên dịch. Tôi đang làm gì sai?

Trả lời

8

Lỗi biên dịch bạn nhận được về cơ bản nói rằng không thể sử dụng giới hạn ngữ cảnh cho bí danh loại. Bối cảnh giới hạn làm việc trong các định nghĩa hàm hoặc lớp. Ví dụ,

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

thực sự là ký hiệu viết tắt cho

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

Lưu ý rằng khác nhau BST đối tượng tiềm năng có thể có khác nhau Ordering s, và những giá trị phải được lưu trữ trong thời gian chạy.

Đối với trường hợp sử dụng của bạn, điều đơn giản nhất có thể là để đặt bối cảnh bị ràng buộc về chức năng chung mà bạn có trong tâm trí,

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

Sau đó thích hợp Ordering[T] ngầm sẽ được tìm thấy tại trang web tiếng gọi của f, trong đó loại T được biết.

+1

Bạn có nghĩa là "Ký hiệu viết tắt cho:' lớp BST [T] (val cây: Cây [T]) (thứ tự ngầm định: Đặt hàng [T]) '" – Faiz

+0

@Faiz, cảm ơn cố định. –