我使用需要其类型A
的类型类来拥有Scalaz Order[A]
的实例。在我的用例中,A
是一个Java类 - 尤其是Joda Time' LocalDate
。该类在实现Comparable
时具有自然顺序。
我无法在Scalaz本身找到Order
个Comparable
个实例,所以我尝试自己写一个:
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]]]
在我硬编码包含Order
实例的隐式val之后,我正如以下所示:
implicit val localDateOrder = comparableOrder[LocalDate, ReadablePartial]
implicitly[Order[LocalDate]]
有没有办法让Scala编译器自动获取此实例?隐式val在这种情况下起作用,但很快就会变得难以使用嵌套结构。我使用的是Scala 2.10.4。
编辑:我还尝试在实施A
而不是Comparable[A]
的{{1}}上对此进行测试,其中Comparable[B]
是B
的超类}。它似乎仍然无法运作:
A