在Scala中键入别名有序泛型

时间:2013-03-28 00:45:53

标签: scala generics comparable type-alias

我对二叉树的外观有一个最小的定义:

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

我现在想要将二进制搜索树定义为:

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

但是没有编译。我做错了什么?

1 个答案:

答案 0 :(得分:9)

您获得的编译错误基本上表示上下文边界不能用于类型别名。上下文边界在函数或类定义中起作用。例如,

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类型已知。