从 Scala 中的 Ordered 获取订单
Get Ordering from Ordered in Scala
给定一个具有特征 Ordered
的对象,有没有什么方法可以得到一个 Ordering
,它使用与原始对象相同的比较?
我想这样做的原因是我已经实现了具有以下签名的合并排序(Manifest
s 只是为了我可以实例化新的 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.Ordering
和math.Ordered
都可以分别通过implicit parameter
和implicit 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]
一切都会如您所愿。
给定一个具有特征 Ordered
的对象,有没有什么方法可以得到一个 Ordering
,它使用与原始对象相同的比较?
我想这样做的原因是我已经实现了具有以下签名的合并排序(Manifest
s 只是为了我可以实例化新的 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.Ordering
和math.Ordered
都可以分别通过implicit parameter
和implicit 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]
一切都会如您所愿。