给定多个类型参数的隐式参数解析

时间:2014-04-15 01:03:58

标签: scala implicit scalaz

我使用需要其类型A的类型类来拥有Scalaz Order[A]的实例。在我的用例中,A是一个Java类 - 尤其是Joda Time' LocalDate。该类在实现Comparable时具有自然顺序。

我无法在Scalaz本身找到OrderComparable个实例,所以我尝试自己写一个:

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

0 个答案:

没有答案