从 Scala 中的 Ordered 获取订单

Get Ordering from Ordered in Scala

给定一个具有特征 Ordered 的对象,有没有什么方法可以得到一个 Ordering,它使用与原始对象相同的比较?

我想这样做的原因是我已经实现了具有以下签名的合并排序(Manifests 只是为了我可以实例化新的 List[T]s 和 Array[T]s:

def mergeSorted[T : Manifest](li: List[T], ord: Ordering[T]) : List[T]

我想做的是用一个带有这个签名的方法重载它:

def mergeSorted[T <: Ordered[T] : Manifest](li: List[T]) : List[T]

这样,如果我要对 Int 进行排序,我就不必手动输入 Int 顺序。在我看来,实现这一点的简单方法就是以某种方式从 T 获取 Ordering[T]ScalaDoc 似乎是说这可以通过隐式实现:

Ordered and Ordering both provide implicits allowing them to be used interchangeably.

但是,我不知道要执行此操作要导入哪些隐含项。

math.Orderingmath.Ordered都可以分别通过implicit parameterimplicit conversion实现你所需要的。根据使用哪一个,mergeSort 函数将具有类似于以下之一的签名:

// Using math.Ordering
def mergeSort[T](li: List[T])(implicit order: Ordering[T]): List[T] = {
  ...
}

// Using math.Ordered
def mergeSort[T <% Ordered[T]](li: List[T]): List[T] = {
  ...
}

有关详细信息,您可能会对这种通用合并排序blog post感兴趣。

如果你定义:

def mergeSorted[T : Ordering : Manifest](li: List[T]) : List[T]

编译器会将其脱糖为

def mergeSorted[T : Manifest](li: List[T])(implicit ev: Ordering[T]) : List[T]

一切都会如您所愿。