我使用的需要及其类型的一个类型的类A
有Scalaz的实例Order[A]
在我的使用情况, A
是一个Java类-尤其约达时间的LocalDate
。 这个类有一个自然排序,因为它实现了Comparable
。
我无法找到一个Order
例如Comparable
在Scalaz本身S,所以我试着写一个自己:
implicit def comparableOrder[A, B]
(implicit ev0: <:<[A, B],
ev1: <:<[A, Comparable[B]]): Order[A] = new Order[A] {
override def order(x: A, y: A): Ordering = Ordering.fromInt(x.compareTo(y))
}
然而,即使把这个定义为范围后,下面几行编译失败:
implicitly[Order[LocalDate]]
implicitly[Order[LocalDate <:< Comparable[LocalDate]]]
但是,下列情况:
implicitly[Order[LocalDate <:< Comparable[ReadablePartial]]]
至于后,我硬编码包含一个隐含的VAL做以下Order
情况我在寻找:
implicit val localDateOrder = comparableOrder[LocalDate, ReadablePartial]
implicitly[Order[LocalDate]]
有没有一种方法,我可以得到Scala编译器来自动拾取这种情况? 隐式VAL工作在这种情况下,但很快就变得笨重与嵌套结构。 我使用Scala的2.10.4。
编辑:我也试着测试这个在A
实现小号Comparable[A]
而非Comparable[B]
其中B
是一个超A
。 它似乎仍然没有工作:
class MyInt(n: Int) extends Comparable[Int] {
override def compareTo(o: Int): Int = n - o
}
implicit def comparableOrder[A <: Comparable[A]]: Order[A] = new Order[A] {
override def order(x: A, y: A): Ordering = Ordering.fromInt(x.compareTo(y))
}
implicitly[Order[MyInt]]